クエリを作成します。
Synopsis
CREATE QUERY queryname(parameter_list) characteristics language
   code_body
引数
queryname 作成するクエリの名前。識別子です。このクエリ名には、修飾なし (StoreName) と修飾付き (Patient.StoreName) のどちらでも使用できます。パラメータが指定されない場合でも、queryname の後には括弧を続ける必要があります。
parameter_list オプション — クエリに渡すパラメータのリスト。パラメータのリストは括弧で囲み、パラメータはコンマで区切ります。パラメータを指定しない場合でも、括弧は必須です。
characteristics オプション — クエリの特性を指定する 1 つ以上のキーワード。使用可能なキーワードは、RESULTS、CONTAINID、FOR、FINAL、ROCEDURE、SELECTMODE です。複数の特性は、空白で区切り、任意の順序で指定できます。
language オプションcode_body に使用するプログラミング言語を指定するキーワード節。LANGUAGE OBJECTSCRIPT (Caché ObjectScript の場合) または LANGUAGE SQL を指定します。language 節を省略する場合は、SQL が既定です。
code_body
クエリのプログラム・コード
SQL プログラム・コードの開始には BEGIN キーワードを使用し、終了には END キーワードを使用します。クエリの code_body は、1 つの完結した SQL 文 (1 つの SELECT 文) のみで構成します。SELECT 文は、セミコロン (;) で終わります。
Caché ObjectScript プログラム・コードは中括弧で囲みます。
概要
CREATE QUERY 文は、クラスにクエリを生成します。既定では、MySelect と命名したクエリが、User.queryMySelect または SQLUser.queryMySelect として保存されます。
CREATE QUERY で作成されるクエリは、ストアド・プロシージャとして公開される場合とそうでない場合があります。ストアド・プロシージャとして公開するクエリを生成するには、characteristics の 1 つとして PROCEDURE キーワードを指定する必要があります。CREATE PROCEDURE 文を使用して、ストアド・プロシージャとして公開されるクエリを生成することも可能です。
クエリの生成には、GRANT コマンドで指定された %CREATE_QUERY 管理者特権が必要です。
引数
name
生成するクエリの名前です。この名前には、修飾なし (StoreName) と、クラス名を指定する修飾付き (Patient.StoreName) のどちらでも指定できます。クエリの名前の後には括弧が必要です。
parameter-list
値をクエリに渡すために使用するパラメータのパラメータ宣言リストです。パラメータのリストは括弧で囲み、リストのパラメータ宣言はコンマで区切ります。パラメータを指定しない場合も括弧は必須です。
リスト内の各パラメータ宣言は、(先頭から順番に) 以下の要素で構成します。
クエリをストアド・プロシージャとして公開すると (characteristics に PROCEDURE キーワードを指定)、プロシージャ・コンテキスト・ハンドラを使用によって、プロシージャとその呼び出し元 (ODBC サーバなど) 間でプロシージャ・コンテキストの相互受け渡しが行われます。このプロシージャ・コンテキスト・ハンドラは、Caché によって (%qHandle:%SQLProcContext として) %sqlcontext オブジェクトを使用して自動生成されます。
以下のようにプロシージャ・コンテキスト・ハンドラは、%SQLProcContext 型で最初のパラメータとして明示的に宣言できます。
  INOUT pHandle %SQLProcContext
%SQLProcContext の属性は SQLCode と RowCount です。これらは通常、以下のように SQL 変数 SQLCODE と %ROWCOUNT に設定されます。
  SET pHandle.SQLCode=SQLCODE,pHandle.RowCount=%ROWCOUNT
characteristics
有効な characteristics キーワードは、以下のとおりです。
characteristics キーワード 概要
CONTAINID integer フィールドが存在する場合は、どのフィールドが ID を返すかを指定します。CONTAINID を ID を返す列の番号に設定するか、または ID を返す列が存在しない場合は 0 を設定します。Caché では、指定されたフィールドが実際に ID を含んでいるかどうかの検証が行われないため、ユーザの入力の誤りによってデータの不一致が起こる可能性があります。
FOR classname メソッドを生成するクラス名を指定します。そのクラスが存在しない場合は新規作成します。メソッド名を認証することによりクラス名を指定することもできます。FOR 節で指定されたクラス名の方が、メソッド名の修飾により指定されたクラス名よりも優先されます。
FINAL サブクラスがメソッドをオーバーライドできないように指定します。既定では、メソッドは最終ではありません。FINAL キーワードはサブクラスによって継承されます。
PROCEDURE クエリが SQL ストアド・プロシージャであることを指定します。ストアド・プロシージャはサブクラスに継承されます(このキーワードは、PROC と略すことができます)。
RESULTS result_set
データ・フィールドをクエリで返された順序で指定します。各フィールドには、列名、データ型 (既定で属性に割り当てられた型と異なる場合)、そしてオプションで見出しを指定します。これらフィールドの特性はコロンで区切ります。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 です。
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 が既定です。
LANGUAGE が SQL の場合、%Library.SQLQuery 型のクラス・クエリが生成されます。LANGUAGE が OBJECTSCRIPT の場合、%Library.Query 型のクラス・クエリが生成されます。
code_body
生成されるクエリのプログラム・コード。このコードは SQL または Caché ObjectScript で指定します。使用する言語は LANGUAGE 節と一致させる必要があります。ただし、Caché ObjectScript のコードには埋め込み SQL を記述できます。
指定したコードが SQL の場合、1 つの SELECT 文で構成する必要があります。SQL クエリのプログラム・コードは BEGIN キーワードで開始し、その後に実際のプログラム・コード (1 つの SELECT 文) を続ける必要があります。プログラム・コードの末尾にはセミコロン (;) を付け、END キーワードで終了します。
指定したコードが OBJECTSCRIPT の場合、Caché が提供する EXECUTE メソッドと FETCH メソッドの呼び出しを含む必要があります。また、CLOSE、FetchRows、FetchODBC、GetInfo メソッド呼び出しを含めることも可能です。Caché ObjectScript コードは、中括弧で囲みます。
Caché は、クエリの実際のコードを生成するために提供されたコードを使用します。
以下の埋め込み SQL の例は、PersonState という名前のクエリを作成します。このクエリでは、パラメータは宣言されず、characteristics および language に既定値が使用されます。
  WRITE !,"Creating a query"
  &sql(CREATE QUERY PersonState() BEGIN
       SELECT Name,Home_State FROM Sample.Person ;
       END)
  IF SQLCODE=0 { WRITE !,"Created a query" }
  ELSEIF SQLCODE=-361 { WRITE !,"Query already exists" }
  ELSE { WRITE !,"SQL error: ",SQLCODE }
システム管理ポータルで、[クラス] オプションを選択し、SAMPLES ネームスペースを選択します。上の例で作成したクエリの User.queryPersonState.cls を見つけます。上のプログラム例を再実行する前に、ここでこのクエリを削除できます。もちろん、DROP QUERY を使用してクエリを削除することも可能です。
関連項目