クラスにメソッドを生成します。
Synopsis
CREATE METHOD name parameter_list characteristics code_body
CREATE STATIC METHOD name parameter_list characteristics code_body
引数
name 生成するメソッドの名前。 識別子 です。このメソッド名は、修飾されていない場合 (StoreName) または修飾されている場合 (Patient.StoreName) があります。
parameter_list オプション — メソッドに渡すパラメータのリスト。パラメータのリストは括弧で囲み、パラメータはコンマで区切られます。
characteristics オプション — メソッドの性質を指定する 1 つ以上のキーワード。使用可能なキーワードは、RETURNS、FOR、FINAL、PRIVATE、PROCEDURE、SELECTMODE です。特性は、空白で区切られ、任意の順序で指定できます。
LANGUAGE OBJECTSCRIPT
LANGUAGE SQL
オプションcode_body に使用されるプログラミング言語。LANGUAGE OBJECTSCRIPT (Caché ObjectScript の場合) または LANGUAGE SQL を指定します。LANGUAGE 節が省略される場合は、SQL が既定です。
code_body メソッドのプログラム・コード。
概要
CREATE METHOD 文は、クラスにメソッドを生成します。オプションの STATIC キーワードは Class Method として知られるスタティック・メソッドを生成します。
CREATE METHOD 文によって生成されるクラス・メソッドは、ストアド・プロシージャである場合とそうでない場合があります。メソッドを SQL ストアド・プロシージャとして公開されているクラスに生成するには、PROCEDURE キーワードを指定する必要があります。既定では、CREATE METHOD はストアド・プロシージャでもあるメソッドを生成しませんが、CREATE PROCEDURE 文はそのようなメソッドを常に生成します。
メソッドの生成には、GRANT コマンドで指定された %CREATE_METHOD 管理者特権が必要です。
SQL 文内からの SQL 関数の呼び出しの詳細は、このドキュメントの SQL の概念のページの "関数の呼び出し" を参照してください。さまざまな状況での SQL ストアド・プロシージャの呼び出しについては、"CALL" 文を参照してください。
引数
name
生成するメソッドの名前。この関数名には、修飾されていない場合 (StoreName) とクラス名で指定して修飾された場合 (Patient.StoreName) があります。
parameter-list
値をメソッドに渡すために使用されるパラメータのリストです。パラメータのリストは括弧で囲み、リストのパラメータ宣言はコンマで区切られます。リストの各パラメータ宣言は、(順に) パラメータ・モードが IN (入力値) か OUT (出力値) か INOUT (入力と変更と出力) かを指定するキーワード、パラメータ名、パラメータのデータタイプ、そしてオプションとして、一重引用符で囲まれた指定された文字列としてのパラメータの既定値に続くキーワードの 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
characteristics
利用できるキーワードは以下の通りです。
FOR classname メソッドを生成するクラス名を指定します。そのクラスが存在しない場合は新規作成します。メソッド名を認証することによりクラス名を指定することもできます。FOR 節で指定されたクラス名の方が、メソッド名の認証により指定されたクラス名よりも優先されます。
FINAL サブクラスがメソッドの上書きを行えないことを指定します。既定では、メソッドは最終ではありません。FINAL キーワードはサブクラスによって継承されます。
PRIVATE メソッドがそれ自身のクラス、またはサブクラスの他のメソッドによってのみ起動できることを指定します。既定ではメソッドはパブリックで、制限なしに起動できます。この制限はサブクラスによって継承されます。
PROCEDURE メソッドが SQL ストアド・プロシージャであることを指定します。ストアド・プロシージャはサブクラスに継承されます (このキーワードは PROC と略されます)。
RETURNS datatype メソッドに対する呼び出しによって返される値のデータ型を指定します。RETURNS が省略されると、メソッドは値を返すことができません。この仕様はサブクラスによって継承されます。
SELECTMODE mode メソッドのコンパイルに使用されるモードを指定します。使用可能な値は、LOGICAL、ODBC、RUNTIME、DISPLAY です。既定は LOGICAL です。
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 クラス・メソッド・コードの最初に追加されます。
LANGUAGE
code_body に使用している言語を指定するキーワード節。使用可能な節は、LANGUAGE OBJECTSCRIPT (Caché ObjectScript の場合) か、LANGUAGE SQL です。LANGUAGE 節が省略される場合は、SQL が既定です。
code_body
生成されるメソッドのプログラム・コード。このコードは SQL または Caché ObjectScript で指定します。使用される言語は LANGUAGE 節と一致する必要があります。しかし、Caché ObjectScript で指定されるコードには組み込み SQL を含むことが可能です。
Caché は、メソッドの実際のコードを生成するために提供されたコードを使用します。指定するコードが SQL の場合、Caché はメソッドを生成する際に追加のコード行を提供します。 追加されるコードは、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
     }
関連項目