SQL ストアド・プロシージャとして公開されているメソッドまたはクエリを生成します。
Synopsis
CREATE PROCEDURE procname(parameter_list) characteristics language
    code_body

CREATE PROC procname(parameter_list) characteristics language
   code_body
引数
procname 生成するストアド・プロシージャの名前。 識別子 です。このプロシージャ名は、修飾されていない場合 (StoreName) または修飾されている場合 (Patient.StoreName) があります。パラメータが指定されない場合でも、procname の後には括弧が続く必要があります。
parameter_list オプション — プロシージャに渡すパラメータのリスト。パラメータのリストは括弧で囲み、パラメータはコンマで区切られます。パラメータが指定されない場合でも、括弧は必須です。各パラメータは、(先頭から順に) オプションの IN、OUT、または INOUT キーワード、変数名、データ型で構成されます。
characteristics オプション — プロシージャの特性を指定する 1 つまたは複数のキーワード。メソッドを生成する際に許可されるキーワードは FINAL、FOR、PRIVATE、RETURNS、SELECTMODE です。クエリを生成する際に許可されるキーワードは CONTAINID、FINAL、FOR、RESULTS、SELECTMODE です。特性は、空白で区切られ、任意の順序で指定できます。
language オプションcode_body に使用されるプログラミング言語を指定するキーワード節。LANGUAGE OBJECTSCRIPT (Caché ObjectScript の場合) または LANGUAGE SQL を指定します。language 節が省略される場合は、SQL が既定です。
code_body
プロシージャのプログラム・コード
SQL プログラム・コードの開始には BEGIN キーワードが使用され、その終了には END キーワードが使用されます。code_body 内の完結した各 SQL 文は、セミコロン (;) で終わります。
Caché ObjectScript プログラム・コードは中括弧で囲まれます。
概要
CREATE PROCEDURE 文は SQL ストアド・プロシージャとして自動的に公開されるメソッドまたはクエリを生成します。ストアド・プロシージャはサブクラスに継承されます。
ストアド・プロシージャとして公開されないメソッドを生成するには、CREATE METHOD または CREATE FUNCTION を使用します。ストアド・プロシージャとして公開されないクエリを生成するには、CREATE QUERY を使用します。これらの文は、PROCEDURE 特性キーワードを指定することで、ストアド・プロシージャとして公開されるメソッドまたはクエリの生成にも使用されます。
プロシージャの生成には、GRANT コマンドで指定された %CREATE_PROCEDURE 管理者特権が必要です。
SQL 文内からの SQL 関数の呼び出しの詳細は、このドキュメントの SQL の概念のページの "関数の呼び出し" を参照してください。さまざまな状況での SQL ストアド・プロシージャの呼び出しについては、"CALL" 文を参照してください。
引数
procname
ストアド・プロシージャとして生成するメソッドまたはクエリの名前です。この名前には、修飾されていない場合 (StoreName) とクラス名で指定して修飾された場合 (Patient.StoreName) があります。プロシージャの名前の後には括弧が必要です。
parameter_list
値をメソッドまたはクエリに渡すために使用されるパラメータのリストです。パラメータのリストは括弧で囲み、リストのパラメータ宣言はコンマで区切られます。パラメータを指定しない場合も括弧は必須です。
リスト内の各パラメータ宣言は、(先頭から順番に) 以下の要素で構成されます。
以下は、3 つのパラメータを持つプロシージャの例です。
CREATE PROCEDURE UpdatePay
  (IN Salary FLOAT DEFAULT '0',
   IN Name VARCHAR(50), 
   INOUT PayBracket VARCHAR(50) DEFAULT 'NULL')
BEGIN
   UPDATE Sample.Person SET Salary = :Salary
   WHERE Name=:Name ;
END
メソッドまたはクエリがストアド・プロシージャとして公開されるため、プロシージャ・コンテキスト・ハンドラを使用して、プロシージャとその呼び出し元 (ODBC サーバなど) 間でプロシージャ・コンテキストの相互受け渡しが行われます。このプロシージャ・コンテキスト・ハンドラは、Caché によって (%qHandle:%SQLProcContext として) %sqlcontext オブジェクトを使用して自動生成されます。
以下のようにプロシージャ・コンテキスト・ハンドラは、タイプ %SQLProcContext で最初のパラメータとして明示的に宣言できます。
  INOUT pHandle %SQLProcContext
%SQLProcContext の属性は SQLCode と RowCount です。これらは通常、以下のように SQL 変数 SQLCODE と %ROWCOUNT に設定されます。
SET pHandle.SQLCode=SQLCODE,pHandle.RowCount=%ROWCOUNT
SQLCODE と %ROWCOUNT の値は、SQL 文の実行によって自動的に設定されます。
characteristics
メソッドの生成にはクエリの生成とは異なる characteristics が使用されます。
有効なメソッド characteristics キーワードは、以下のとおりです。
メソッド・キーワード 意味
FOR classname メソッドを生成するクラス名を指定します。そのクラスが存在しない場合は、新規作成します。メソッド名を修飾することにより、クラス名を指定することもできます。FOR 節で指定されたクラス名が、メソッド名の修飾により指定されたクラス名にオーバーライドされます。
FINAL サブクラスがメソッドをオーバーライドできないことを指定します。デフォルトでは、メソッドは最終ではありません。FINAL キーワードは、サブクラスによって継承されます。
PRIVATE メソッドがそれ自身のクラス、またはサブクラスの他のメソッドによってのみ起動できることを指定します。デフォルトではメソッドはパブリックで、制限なしに起動できます。この制限はサブクラスによって継承されます。
RETURNS datatype メソッドに対する呼び出しによって返される値のデータ型を指定します。RETURNS が省略されると、メソッドは値を返すことができません。この仕様はサブクラスによって継承されます。
SELECTMODE mode メソッドのコンパイルに使用されるモードを指定します。使用可能な値は、LOGICAL、ODBC、RUNTIME、DISPLAY です。既定は LOGICAL です。
有効なクエリ characteristics キーワードは、以下のとおりです。
クエリ・キーワード 概要
CONTAINID integer フィールドが存在する場合は、どのフィールドが ID を返すか指定します。 CONTAINID を ID を返すコラムの番号に設定するか、または ID を返す列が存在しない場合は 0 を設定します。 Caché は、名前の付いたフィールドが実際に ID を含むことを認証しないため、非一貫性データでユーザ・エラーが発生します。
FOR classname メソッドを生成するクラス名を指定します。そのクラスが存在しない場合は、新規作成します。メソッド名を修飾することにより、クラス名を指定することもできます。FOR 節で指定されたクラス名が、メソッド名の修飾により指定されたクラス名にオーバーライドされます。
FINAL サブクラスがメソッドをオーバーライドできないことを指定します。デフォルトでは、メソッドは最終ではありません。FINAL キーワードは、サブクラスによって継承されます。
RESULTS result_set
データ・フィールドをクエリで返された別のフィールドへ指定します。各フィールドでは、列名、データ型 (デフォルトで属性に割り当てられたタイプと異なる場合)、そしてオプションとして見出しを指定します。これらフィールドの特性はコロンで区切ります。結果セット内の異なるフィールドはコンマで区切ります。
LANGUAGE SQL の場合、クエリが SELECT * でない限り RESULTS キーワードを省略することができます。RESULTS キーワードを省略する場合、ROWSPEC はクラス・コンパイル中に自動生成します。
SELECTMODE mode クエリをコンパイルするために使用するモードを指定します。使用可能な値は、LOGICAL、ODBC、RUNTIME、DISPLAY です。デフォルトは RUNTIME です。
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 クラス・メソッド・コードの最初に追加されます。
RESULTS 節は、クエリの結果を指定します。RESULTS 節の SQL データ型パラメータが、クエリの ROWSPEC の対応する Caché データ型パラメータに変換されます。例えば、RESULTS 節の RESULTS ( Code VARCHAR(15) ) では、ROWSPEC = “Code:%Library.String(MAXLEN=15)” という ROWSPEC 仕様が生成されます。
language
code_body に使用している言語を指定するキーワード節。使用可能な節は、LANGUAGE OBJECTSCRIPT (Caché ObjectScript の場合) か、LANGUAGE SQL です。LANGUAGE 節が省略される場合は、SQL が既定です。
code_body
生成されるメソッドまたはクエリのプログラム・コード。このコードは SQL または Caché ObjectScript で指定します。使用される言語は LANGUAGE 節と一致する必要があります。しかし、Caché ObjectScript で指定されるコードには組み込み SQL を含むことが可能です。Caché は、メソッドまたはクエリの実際のコードを生成するために提供されたコードを使用します。
SQL プログラム・コードの開始には BEGIN キーワードが使用され、その後に SQL コード自体が続きます。完結した各 SQL 文の末尾では、セミコロン (;) を指定します。1 つのクエリに含めることができるのは、1 つの SQL 文、つまり 1 つの SELECT 文のみです。SQL プログラム・コードの終了には、END キーワードが使用されます。
Caché ObjectScript プログラム・コードは、{ code } のように中括弧で囲まれます。
SQL を Caché ObjectScript “ラッパ” に埋め込んだプロシージャを生成する際、Caché は、プロシージャ・コンテキスト・ハンドラを提供し、返り値を処理する追加のコード行を提供します。以下は この Caché から生成されたラッパ・コードの例です。
   NEW SQLCODE,%ROWID,%ROWCOUNT,title
   &sql( code_body )
   QUIT $GET(title)
指定したコードが OBJECTSCRIPT の場合、(変数で NEW を実行し、QUIT で終了し、終了後に値を返す) “ラッパ” を明示的に定義する必要があります。
クエリを生成するとき、指定したコードが SQL の場合は、1 つの SELECT 文で構成する必要があります。指定したコードが OBJECTSCRIPT の場合、Caché が提供する EXECUTE メソッドと FETCH メソッドの呼び出しを含む必要があります。また、CLOSE、FetchRows、FetchODBC、GetInfo メソッド呼び出しを含むことも可能です。
以下の例は、ストアド・プロシージャとして公開される、PersonStateSP という名前のシンプルなクエリを作成します。このクエリでは、パラメータは宣言されず、characteristics および language に既定値が使用されます。
  WRITE !,"Creating a procedure"
  &sql(CREATE PROCEDURE PersonStateSP() BEGIN
       SELECT Name,Home_State FROM Sample.Person ;
       END)
  IF SQLCODE=0 { WRITE !,"Created a procedure" }
  ELSEIF SQLCODE=-361 { WRITE !,"Procedure already exists" }
  ELSE { WRITE !,"SQL error: ",SQLCODE }
Caché エクスプローラを起動すると、上記の例で作成したストアド・プロシージャの SQLUser.procPersonStateSP が SAMPLES データベース・クラス・フォルダにあるのがわかります。上記のプログラム例を再実行する前に、Caché エクスプローラを使用してこのプロシージャを削除できます。もちろん、DROP PROCEDURE を使用してプロシージャを削除できます。
  WRITE !,"Deleting a procedure"
  &sql(DROP PROCEDURE SAMPLES.PersonStateSP)
  IF SQLCODE=0 { WRITE !,"Deleted a procedure" }
  ELSEIF SQLCODE=-362 { WRITE !,"Procedure did not exist" }
  ELSE { WRITE !,"SQL error: ",SQLCODE }
以下の例は、CREATE PROCEDURE を使用して、Sample.Employee クラスに UpdateSalary メソッドを生成します。
CREATE PROCEDURE 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 PROCEDURE を使用して、Sample.Employee クラスに GetTitle メソッドを生成し、Title 値を返します。
CREATE PROCEDURE 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
     }
プロシジャ・ハンドラ pHandle を使用します。 対応する SQL 変数を使用して、このハンドラの SQLCode 属性と RowCount 属性を設定します。プロシージャの LANGUAGE OBJECTSCRIPT キーワードに続く Caché ObjectScript を中括弧で囲むことに注意してください。Caché ObjectScript コードには、&sql でマークされ、角括弧で囲まれた埋め込み SQL コードがあります。
関連項目