InterSystems IRIS プログラミングの概要
このページでは、サーバ側コードに重点を置いて、InterSystems IRIS® データ・プラットフォームにおけるアプリケーションの大まかな概要を提供します。
概要
InterSystems IRIS は、InterSystems SQL と呼ばれる SQL の実装を備え、Python のサポート、および ObjectScript と呼ばれる汎用プログラミング言語のサポートが組み込まれた、高性能なマルチモデル・データ・プラットフォームです。InterSystems IRIS はクラス定義もサポートし、クラスの手順の部分は、Python または ObjectScript で実装できます。システム・クラスのセットにより、オブジェクトと永続オブジェクト (テーブル) をモデル化できます。その他のシステム・クラスでは、広範な API が提供されます。
InterSystems IRIS プログラミングには、以下の機能があります。
-
InterSystems IRIS では、多重プロセスがサポートされ、並列処理の制御が可能です。各プロセスは、データに直接アクセスします。
-
SQL、Python、ObjectScript から直接データベース・ストレージを利用できます。
-
どの場合でも、格納するデータは最終的にグローバルという構造に収められます。
SQL、Python、ObjectScript コマンドをコマンド行シェルで実行できます。コマンド行シェルは、IDE を補完する便利なツールです。管理ポータルで SQL を実行することもできます。
InterSystems IRIS では、Unicode データとローカライズをサポートしています。
InterSystems IRIS アプリケーションのコンポーネント
アプリケーション開発者の観点からすると、InterSystems IRIS アプリケーションは InterSystems IRIS サーバ上の以下の要素の一部またはすべてで構成されます。
-
コードへのアクセスを制御する、アプリケーション定義。
許可される認証メカニズムや、コードの実行を開始する InterSystems IRIS ネームスペースなどを制御します。
-
そのネームスペースで利用可能な InterSystems IRIS クラス定義、ルーチン、インクルード・ファイルの任意の組み合わせ。クラスとルーチンは相互に使用でき、相互に呼び出すことができます。インクルード・ファイルは、クラスまたはルーチン内で使用されるマクロの中心的な定義を提供します。
-
アプリケーションが実行を開始するネームスペースを含む、1 つ以上のネームスペース。
-
アプリケーションのデータとコードを含む、1 つ以上のデータベース。
-
外部ファイル (必要に応じて)。
InterSystems IRIS では、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 は、メソッド内およびルーチン内で使用できます。また、前述したように、SQL DDL コマンドを使用してテーブルを作成することもできます (永続クラス)。
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 では、インクルード・ファイルは、実際にはオペレーティング・システム内の個別のスタンドアロンのファイルではなく、InterSystems IRIS データベース内に格納されるコード・ユニットです。
コードの場所
InterSystems IRIS では、クラス定義、ルーチン、インクルード・ファイルは InterSystems IRIS データベース内に格納されます。IDE では、このコードを編集し、選択したソース・コントロール・システムと同期するためのオプションが提供されています。
これらのコード要素がどのように連携しているか
このページで紹介するコード要素が 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 コードは中間層であり、この層では、データへのアクセスは直接グローバル・アクセスを使用して処理されます。これは人間が読めるコードであり、IDE 内で確認できます。
-
INT コードは OBJ コードの生成に使用され、PY コードは PYC コードの生成に使用されます。このコードは、InterSystems IRIS 仮想マシンによって使用されます。コードを OBJ コードや PYC コード (最終コード) にコンパイルしたら、INT ルーチンや PY ルーチンはコードの実行に不要となります。
-
クラスをコンパイルしたら、それらを配置モードにすることができます。InterSystems IRIS には、指定クラスの中間コードと内部クラスを削除するユーティリティがあり、このユーティリティはアプリケーションを配置するときに使用できます。
InterSystems IRIS システム・クラスを調べると、クラスによっては配置モードになっているため、見えないことがあります。
中間コードと最終コードは、生成元のコードが含まれる同じデータベースに格納されます。