name
作成する関数 (メソッド) の名前。この名前は、未修飾 (StoreName) にして既定のスキーマ名を使用しても、スキーマ名を指定して修飾 (Patient.StoreName) してもかまいません。$SYSTEM.SQL.Schema.Default()Opens in a new tab メソッドを使用して、現在のシステム全体の既定のスキーマ名を確認できます。初期のシステム全体の既定のスキーマ名は、クラス・パッケージ名 User に対応する SQLUser です。
FOR 特性 (後述) は、name で指定されたクラス名をオーバーライドすることに注意してください。この名前のメソッドが既に存在する場合、この操作は失敗して SQLCODE -361 エラーが発行されます。このエラーを回避するには、オプションの OR REPLACE キーワードを使用するか、最初に DROP FUNCTION で古い関数を削除します。
生成されるクラスの名前は、スキーマ名に対応するパッケージ名の後にドット、“func”、指定の name が順に続いたものになります。例えば、未修飾の関数名 RandomLetter で初期の既定のスキーマ SQLUser が使用される場合、生成されるクラス名は User.funcRandomLetter となります。詳細は、"InterSystems SQL の使用法" の “ストアド・プロシージャの定義と使用” の章の "SQL からクラス名への変換" を参照してください。
InterSystems SQL では、大文字/小文字の区別が異なるだけの重複関数名を指定することは許可されていません。既存の関数名と大文字/小文字区別が異なるだけの関数名を指定した場合には、SQLCODE -400 エラーが生成されます。
parameter-list
値を関数に渡すために使用するパラメータのリストです。パラメータのリストは括弧で囲み、リストのパラメータ宣言はコンマで区切ります。リスト内の各パラメータ宣言は、(先頭から順番に) 以下の要素で構成します。
-
パラメータ・モードが IN (入力値)、OUT (出力値)、または INOUT (変更値) のいずれであるかを指定するオプションのキーワード。省略した場合、既定のパラメータ・モードは IN です。
-
パラメータ名。パラメータ名では、大文字と小文字が区別されます。
-
パラメータのデータ型。
-
オプション : パラメータの既定値。DEFAULT キーワードの後ろに既定値を付けて指定できます。DEFAULT キーワードはオプションです。既定値が指定されていない場合、既定値は NULL であると見なされます。
以下の例では、2 つの入力パラメータを指定しており、どちらにも既定値があります。オプションの DEFAULT キーワードは、1 つ目のパラメータでは指定されていますが、2 つ目のパラメータでは省略されています。
CREATE FUNCTION RandomLetter(IN firstlet CHAR DEFAULT 'A',IN lastlet CHAR 'Z')
BEGIN
-- SQL program code
END
ユーザ定義関数は、ユーザ定義の集約関数の節に指定します。ユーザ定義の集約関数で使用する関数を定義する場合は、出力値を集約して渡すために使用する状態パラメータを定義します。
関数は、データの行の値に依存するパラメータ (%ID フィールドなど) を 1 つ以上取る場合、相関関数になります。相関関数は行単位で評価され、相関関数ではない関数 (つまり、パラメータを取らないか、すべての行にわたって一貫性を維持する引数を取る関数) は 1 回だけ評価されます。
code_body
生成されるメソッドのプログラム・コード。このコードは SQL または ObjectScript で指定します。使用する言語は LANGUAGE 節と一致させる必要があります。ただし、ObjectScript のコードには埋め込み SQL を記述できます。
InterSystems IRIS は、メソッドの実際のコードを生成するために提供されたコードを使用します。指定するコードが SQL の場合、メソッドの生成時にコード行が追加されます。追加のコードでは、SQL が ObjectScript "ラッパ" に埋め込まれ、(必要に応じて) プロシージャ・コンテキスト・ハンドラが作成され、返り値が処理されます。以下は この InterSystems IRIS から生成されたラッパ・コードの例です。
NEW SQLCODE,%ROWID,%ROWCOUNT,title
&sql( SELECT col FROM tbl )
QUIT $GET(title)
指定するコードが OBJECTSCRIPT である場合、ObjectScript コードは中括弧で囲む必要があります。すべてのコード行を列 1 からインデントする必要がありますが、ラベルとマクロ・プリプロセッサ指示文はその必要はありません。ラベルやマクロ指示文の前には、列 1 でコロン (:) を付加する必要があります。
ObjectScript コードの場合、"ラッパ" (変数を NEW で処理して、QUIT を使用して終了し、(オプションで) 完了時に値を返す) を明示的に定義する必要があります。
ストアド・プロシージャが呼び出されると、クラス %Library.SQLProcContextOpens in a new tab のオブジェクトが %sqlcontext 変数でインスタンス化されます。このプロシージャ・コンテキスト・ハンドラによって、プロシージャとその呼び出し元 (ODBC サーバなど) 間でプロシージャ・コンテキストの受け渡しが行われます。
%sqlcontext は、エラー・オブジェクト、SQLCODE エラー・ステータス、SQL 行カウント、およびエラー・メッセージを含む、いくつかのプロパティで構成されます。以下の例は、これらプロパティの設定に使用される値を示しています。
SET %sqlcontext.%SQLCODE=SQLCODE
SET %sqlcontext.%ROWCOUNT=%ROWCOUNT
SET %sqlcontext.%Message=%msg
SQLCODE と %ROWCOUNT の値は、SQL 文の実行によって自動的に設定されます。%sqlcontext オブジェクトは、実行される前に毎回リセットされます。
または、%SYSTEM.Error オブジェクトをインスタンス化し、%sqlcontext.Error として設定することによって、エラー・コンテキストを設定することができます。
指定した関数が既に存在する場合は、SQLCODE -361 エラーが生成されます。このエラーを回避するには、オプションの OR REPLACE キーワードを使用するか、最初に DROP FUNCTION で古い関数を削除します。