クラスにメソッドを生成します。
Synopsis
CREATE METHOD name(parameter_list) characteristics code_body
CREATE STATIC METHOD name(parameter_list) characteristics code_body
CREATE METHOD 文は、クラスにメソッドを生成します。オプションの STATIC キーワードはスタティック・メソッドを生成します。スタティック・メソッドはクラス・メソッドとも呼ばれます。
CREATE METHOD 文によって生成されるクラス・メソッドは、ストアド・プロシージャである場合とそうでない場合があります。メソッドを SQL ストアド・プロシージャとして公開されているクラスに生成するには、PROCEDURE キーワードを指定する必要があります。既定では、
CREATE METHOD はストアド・プロシージャでもあるメソッドを生成しませんが、
CREATE PROCEDURE 文はそのようなメソッドを常に生成します。
メソッドの生成には、
GRANT コマンドで指定された %CREATE_METHOD 管理者特権が必要です。
SQL 文内からの SQL 関数の呼び出しの詳細は、このドキュメントの "SQL の概念" のページの "
関数の呼び出し" を参照してください。さまざまな状況での SQL ストアド・プロシージャの呼び出しについては、"
CALL" 文を参照してください。
生成するメソッドの名前。この関数名には、修飾されない場合 (StoreName) と、クラス名の指定で修飾される場合 (Patient.StoreName) があります。
値をメソッドに渡すために使用されるパラメータのリストです。パラメータのリストは括弧で囲み、リストのパラメータ宣言はコンマで区切ります。リストのパラメータ宣言は、先頭から順に、パラメータ・モードを指定するキーワード (IN : 入力値、OUT : 出力値、INOUT : 入力、変更、出力)、パラメータ名、パラメータのデータ型、さらにオプションのキーワード DEFAULT から成ります。キーワード DEFAULT の後には、パラメータの既定値を一重引用符で囲んだ文字列で記述します。例えば以下のようになります。
IN Salary FLOAT DEFAULT '0'
メソッドをストアド・プロシージャとして公開すると (PROCEDURE キーワードを指定)、プロシージャ・コンテキスト・ハンドラを使用して、プロシージャとその呼び出し元 (ODBC サーバなど) 間でプロシージャ・コンテキストの相互受け渡しが行われます。このプロシージャ・コンテキスト・ハンドラは、Caché によって (%qHandle:%SQLProcContext として)
%sqlcontext オブジェクトを使用して自動生成されます。
以下のようにプロシージャ・コンテキスト・ハンドラは、%SQLProcContext 型で最初のパラメータとして明示的に宣言できます。
INOUT pHandle %SQLProcContext
%SQLProcContext の属性は SQLCode と RowCount です。これらは通常、以下のように SQL 変数 SQLCODE と %ROWCOUNT に設定されます。
SET pHandle.SQLCode=SQLCODE,pHandle.RowCount=%ROWCOUNT
SELECTMODE はデータを返すモードを指定します。
mode 値が LOGICAL の場合は、論理 (内部保存) 値が返されます。例えば、日付は $HOROLOG 形式で返されます。
mode 値が ODBC の場合、論理と ODBC 間の変換が適用され、ODBC 形式値が返されます。
mode 値が DISPLAY の場合、論理と表示間の変換が適用され、表示形式値が返されます。
mode 値が RUNTIME の場合、ローカル変数 %Runtime を設定して、実行時にモードを LOGICAL、ODBC、DISPLAY のいずれかに設定できます。これは、%Library.ResultSet RuntimeMode プロパティを使用して設定できます。RUNTIME モードの既定は LOGICAL です。
SELECTMODE に指定した値は、#SQLCOMPILE SELECT=
mode のように Caché ObjectScript クラス・メソッド・コードの最初に追加されます。
code_body に使用している言語を指定するキーワード節。使用可能な節は、LANGUAGE OBJECTSCRIPT (Caché ObjectScript の場合) か、LANGUAGE SQL です。LANGUAGE 節が省略される場合は、SQL が既定です。
生成されるメソッドのプログラム・コード。このコードは SQL または Caché ObjectScript で指定します。使用する言語は LANGUAGE 節と一致させる必要があります。ただし、Caché ObjectScript のコードには埋め込み SQL を記述できます。
Caché は、メソッドの実際のコードを生成するために提供されたコードを使用します。指定するコードが SQL の場合、メソッドの生成時にコード行が追加されます。追加のコードでは、SQL が Caché ObjectScript "ラッパ" に埋め込まれ、(必要に応じて) プロシージャ・コンテキスト・ハンドラが作成され、返り値が処理されます。以下は この Caché から生成されたラッパ・コードの例です。
NEW SQLCODE,%ROWID,%ROWCOUNT,title
&sql( SELECT col FROM tbl )
QUIT $GET(title)
指定したコードが OBJECTSCRIPT の場合、(変数で NEW を実行し、QUIT で終了し、(オプションとして) 終了後に値を返す) "ラッパ" を明示的に定義する必要があります。
以下の例は、
CREATE METHOD を使用して、Sample.Employee クラスに UpdateSalary メソッドを生成しています。
CREATE METHOD UpdateSalary ( IN SSN VARCHAR(11), IN Salary FLOAT )
FOR Sample.Employee
BEGIN
UPDATE Sample.Employee SET Salary = :Salary WHERE SSN = :SSN;
END
以下の例は、Caché ObjectScript コードで
CREATE METHOD を使用して、Sample.Employee クラスに GetTitle メソッドを生成し、
Title 値を返します。
CREATE METHOD Sample_Employee.GetTitle(
INOUT pHandle %SQLProcContext,
IN SSN VARCHAR(11),
INOUT Title VARCHAR(50) )
RETURNS VARCHAR(30)
FOR Sample.Employee
LANGUAGE OBJECTSCRIPT
{
NEW SQLCODE,%ROWCOUNT
&sql(SELECT Title INTO :Title FROM Sample.Employee
WHERE SSN = :SSN)
IF $GET(pHandle)'=$$$NULLOREF {
SET pHandle.SQLCode=SQLCODE
SET pHandle.RowCount=%ROWCOUNT }
QUIT
}