Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

InterSystems IRIS プログラミングの概要

このページでは、InterSystems IRIS® サーバ側プログラムで使用できる言語要素の概要を示します。

はじめに

InterSystems IRIS は、ObjectScript と呼ばれる汎用プログラミング言語と Python のサポートが組み込まれた高性能のマルチモデル・データ・プラットフォームです。

InterSystems IRIS では、多重プロセスがサポートされ、並列処理の制御が可能です。各プロセスは、データに直接アクセスします。

InterSystems IRIS では、自身の嗜好に合わせて、クラス、ルーチン、またはそれらの組み合わせを記述できます。どの場合でも、格納するデータは最終的にグローバルという構造に収められます。InterSystems IRIS プログラミングには、以下の機能があります。

  • クラスとルーチンは相互に交換して使用できます。

  • クラスとルーチンはお互いを呼び出すことができます。

  • クラスには、オブジェクト指向の機能が用意されています。

  • データベース・ストレージは、ObjectScript と Python の両方に統合されます。

  • クラスは、プログラミングが簡素化されるようにデータを永続化できます。永続クラスを使用する場合、データは、オブジェクト、SQL テーブル、およびグローバルとして同時に使用できます。

  • グローバルには、クラスとルーチンのどちらからでも直接アクセスできます。つまり、完全に目的どおりにデータの格納およびデータへのアクセスを行える柔軟性を備えています。

ユーザのニーズに合ったアプローチを選択できます。

クラス

InterSystems IRIS ではクラスがサポートされます。システム・クラスを使用することも、独自のクラスを定義することもできます。

InterSystems IRIS では、プロパティ、メソッド、パラメータ (他のクラス言語では定数と呼ぶ) など、よく知られたクラス要素をクラスに含めることができます。また、トリガ、クエリ、インデックスなど、クラスでは通常定義されない項目を含めることもできます。

InterSystems IRIS クラス定義では、クラス定義言語 (CDL) を使用して、クラスとそのメンバ (プロパティ、メソッド、パラメータなど) を指定します。メソッド内部の実行可能コードの記述には、Python または ObjectScript を使用できます。メソッドごとに、Language キーワードを使用して、そのメソッドの記述に使用する言語を指定します。以下に例を示します。

クラス定義を以下に示します。

Class Sample.Employee Extends %Persistent
{

/// The employee's name.
Property Name As %String(MAXLEN = 50);

/// The employee's job title.
Property Title As %String(MAXLEN = 50);

/// The employee's current salary.
Property Salary As %Integer(MAXVAL = 100000, MINVAL = 0);

/// This method prints employee information using ObjectScript.
Method PrintEmployee() [ Language = objectscript] 
{
    Write !,"Name: ", ..Name, " Title: ", ..Title
}

}
Class Sample.Employee Extends %Persistent
{

/// The employee's name.
Property Name As %String(MAXLEN = 50);

/// The employee's job title.
Property Title As %String(MAXLEN = 50);

/// The employee's current salary.
Property Salary As %Integer(MAXVAL = 100000, MINVAL = 0);

/// This method prints employee information using Embedded Python.
Method PrintEmployee() [ Language = python ] 
{
    print("\nName:", self.Name, "Title:", self.Title)
}

}

メソッドで使用する言語を指定しない場合、コンパイラはメソッドが ObjectScript で記述されていると想定します。

InterSystems IRIS の各種クラスおよび InterSystems IRIS の各種永続クラス固有の機能については別途説明します。

ルーチン

InterSystems IRIS でルーチンを作成する場合は ObjectScript を使用します。以下に示すのは、ObjectScript で記述されたルーチンの一部です。

    SET text = ""
    FOR i=1:5:$LISTLENGTH(attrs)
    {
        IF ($ZCONVERT($LIST(attrs, (i + 1)), "U") = "XREFLABEL")
        {
            SET text = $LIST(attrs, (i + 4))
            QUIT
        }
    }
    
    IF (text = "")
    {
        QUIT $$$ERROR($$$GeneralError,$$$T("Missing xreflabel value"))
    }

クラスとルーチンを一緒に使用する方法

InterSystems IRIS では、クラスをルーチン内から使用できます。例えば、以下はルーチンの一部を示しており、ここでは Sample.Employee クラスを参照しています。

 //get details of random employee and print them
showemployee() public {
    set rand=$RANDOM(10)+1        ; rand is an integer in the range 1-10
    write "Your random number: "_rand
    set employee=##class(Sample.Employee).%OpenId(rand)  
    do employee.PrintEmployee()
    write !,"This employee's salary: "_employee.Salary
      
    }

同様に、メソッドはルーチン内のラベルを呼び出すことができます。例えば、以下はルーチン employeeutils 内のラベル ComputeRaise を呼び出します。

Method RaiseSalary() As %Numeric
{
    set newsalary=$$ComputeRaise^employeeutils(..Salary)
    return newsalary
}
Method RaiseSalary() as %Numeric [ Language = python ]
{
    import iris
    newsalary=iris.routine("ComputeRaise^employeeutils", self.Salary)
    return newsalary
}

グローバルの概要

InterSystems IRIS では、他のプログラミング言語にはない特殊な変数がサポートされています。それがグローバル変数です (通常、単にグローバルと呼ばれます)。InterSystems IRIS では、グローバルという用語は、そのデータが、このデータベースにアクセスするすべてのプロセスで使用可能であることを示します。その使用は他のプログラミング言語とは異なっており、他のプログラミング言語では、グローバルは “そのモジュールのすべてのコードで使用可能であること” を意味します。

グローバルのコンテンツは、InterSystems IRIS データベースに保存されます。ここでは、以下の点のみを理解しておくことが重要です。

  • グローバルは、データベースに自動的に格納されます。グローバル変数のノードに値を割り当てると、そのデータは直ちにデータベースに書き込まれます。

  • グローバルのコンテンツは、プログラムによって、または管理ポータルを使用して表示できます。

データへのアクセス方法

InterSystems IRIS では、データベースにグローバル以外は何も含まれていません。このドキュメントで後述するように、コードもグローバルに格納されます。最も低いレベルでは、データへのアクセスはすべて、直接グローバル・アクセスを介して、つまり、グローバルを直接操作するコマンドおよび関数を使用して行われます。

このドキュメントで後述する永続クラスを使用する場合は、以下の方法で、格納されるデータを作成、変更、および削除できます。

  • ObjectScript で、%New()%Save()%Open()%Delete() などのメソッドを使用する。

  • Python で、_New()_Save()_Open()_Delete() などのメソッドを使用する。

  • ObjectScript で、直接グローバル・アクセスを使用する。

  • Python で、gref() メソッドを使用して直接グローバル・アクセスを提供する。

  • InterSystems SQL を使用

内部では、システムは常に、直接グローバル・アクセスを使用します。

InterSystems SQL

InterSystems IRIS は、InterSystems SQL と呼ばれる SQL の実装を提供します。InterSystems SQL は、メソッド内およびルーチン内で使用できます。

ObjectScript からの SQL の使用

以下のいずれかまたは両方の方法を使用して、ObjectScript から SQL を実行できます。

  • ダイナミック SQL (%SQL.StatementOpens in a new tab クラスおよび %SQL.StatementResultOpens in a new tab クラス)。以下に例を示します。

     SET myquery = "SELECT TOP 5 Name, Title FROM Sample.Employee ORDER BY Salary"
     SET tStatement = ##class(%SQL.Statement).%New()
     SET tStatus = tStatement.%Prepare(myquery)
     SET rset = tStatement.%Execute()
     DO rset.%Display()
     WRITE !,"End of data"
    

    ダイナミック SQL は、ObjectScript のメソッドおよびルーチンで使用できます。

  • 埋め込み SQL。以下に例を示します。

     &sql(SELECT COUNT(*) INTO :myvar FROM Sample.Employee)
        IF SQLCODE<0 {WRITE "SQLCODE error ",SQLCODE," ",%msg  QUIT}
        ELSEIF SQLCODE=100 {WRITE "Query returns no results"  QUIT}
     WRITE myvar

    最初の行は埋め込み SQL であり、InterSystems SQL クエリを実行し、myvar と呼ばれるホスト変数に値を書き込みます。

    次の行は通常の ObjectScript であり、変数 myvar の値を書き込むのみです。

    埋め込み SQL は、ObjectScript のメソッドおよびルーチンで使用できます。

Python からの SQL の使用

Python からの SQL の使用は、ObjectScript からのダイナミック SQL の使用と同様です。以下のいずれかまたは両方の方法を使用して、Python から SQL を実行できます。

  • SQL クエリを直接実行できます。以下に例を示します。

    import iris
    rset = iris.sql.exec("SELECT * FROM Sample.Employee ORDER BY Salary") 
    for row in rset:
        print(row)
    
    

    2 行目で InterSystems SQL クエリを実行し、変数 rset に格納された結果セットを返します。

  • 最初に SQL クエリを準備してから実行することもできます。以下に例を示します。

    import iris
    statement = iris.sql.prepare("SELECT * FROM Sample.Employee ORDER BY Salary")
    rset = statement.execute()
    for row in rset:
        print(row)
    
    

    この例では、2 行目で SQL クエリを返します。この SQL が 3 行目で実行され、結果セットが返されます。

Python ターミナルまたは Python メソッドでこれらのいずれかの方法を使用して、SQL クエリを実行できます。

マクロ

ObjectScript では、置換を定義するマクロもサポートします。その定義は、値、あるコード行の全体、(##continue 指示文も含む) 複数の行のいずれかです。マクロは、整合性を確保するために使用します。以下はその例です。

 #define StringMacro "Hello, World!"

 write $$$StringMacro

マクロの使用の詳細は、"マクロとインクルード・ファイルの使用" を参照してください。

インクルード・ファイル

ルーチンの中でマクロを定義し、それを同じルーチンの中で後で使用できます。より一般的には、それらは中央の場所で定義します。このためには、インクルード・ファイルを作成して使用します。インクルード・ファイルは、マクロを定義し、他のインクルード・ファイルをインクルードできます。

インクルード・ファイルの使用法の詳細は、"マクロとインクルード・ファイルの使用" を参照してください。

これらのコード要素がどのように連携しているか

このページで紹介するコード要素が InterSystems IRIS でどのように使用されるのかを理解しておくと役立ちます。

ObjectScript、Python、InterSystems SQL、クラス定義、マクロ、ルーチンなどを組み合わせて使用できるのは、記述したコードを InterSystems IRIS が直接使用しているのではないからです。代わりに、コードのコンパイル時に、システムが使用する下位レベルのコードが生成されます。これは、ObjectScript の場合は ObjectScript エンジンで使用される OBJ コードであり、Python の場合は Python エンジンで使用される PYC コードです。

複数のステップがあります。ステップを詳細に理解しておく必要はありませんが、以下の点を覚えておくことをお勧めします。

  • クラス・コンパイラは、Python メソッド以外のすべての要素について、クラス定義および ObjectScript コードを処理して INT コードを生成します。Python コードは PY コードに処理されます。

    場合によっては、コンパイラは、ユーザが編集できない追加クラスを生成および保存します。これは、例えば、Web サービスおよび Web クライアントを定義するクラスをコンパイルしたときに行われます。

    クラス・コンパイラは、各クラスのクラス記述子も生成します。これは、システム・コードが実行時に使用します。

  • ObjectScript コードの場合、プリプロセッサ (マクロ・プリプロセッサまたは MPP と呼ばれることもあります) は、インクルード・ファイルを使用し、マクロを置換します。また、ルーチン内の埋め込み SQL も処理します。

    これらの変更は、一時的な作業領域で行われ、コードが変更されることはありません。

  • ルーチンの INT コードは追加のコンパイラによって作成されます。

  • INT コードおよび PY コードは中間層であり、この層では、データへのアクセスは直接グローバル・アクセスを使用して処理されます。これは人間が読めるコードです。

  • INT コードは OBJ コードの生成に使用され、PY コードは PYC コードの生成に使用されます。このコードは、InterSystems IRIS 仮想マシンによって使用されます。コードを OBJ コードや PYC コードにコンパイルしたら、INT ルーチンや PY ルーチンはコードの実行に不要となります。

  • クラスをコンパイルしたら、それらを配置モードにすることができます。InterSystems IRIS には、指定クラスの中間コードと内部クラスを削除するユーティリティがあり、このユーティリティはアプリケーションを配置するときに使用できます。

    InterSystems IRIS システム・クラスを調べると、クラスによっては配置モードになっているため、見えないことがあります。

Note:

クラス定義およびルーチンはすべて、生成済みコードとして同じ InterSystems IRIS データベースに格納されます。これにより、コードの管理が容易になります。InterSystems IRIS には一連の堅牢なソース・コントロール・フックが用意されており、インターシステムズの開発者はそれらを長年にわたって使用してきました。これらのフックはユーザも使用できます。

FeedbackOpens in a new tab