PREPARE

PREPARE ステートメントは、文字ストリング形式のステートメントから実行可能な 形式の SQL ステートメントを作成します。このような文字ストリング形式は、 ステートメント・ストリング と呼ばれ、 実行可能な形式は、準備済みステートメント と呼ばれます。

呼び出し

このステートメントは、アプリケーション・プログラム、SQL 関数、 SQL プロシージャー、またはトリガー内にのみ組み込むことができます。 これは実行可能ステートメントですが、動的に準備することはできません。Java™ では指定できません。

権限

権限の規則は、その PREPARE ステートメントに指定された SQL ステートメントに対して定義されている規則と同じです。 例えば、SELECT ステートメントを準備する場合に適用される権限規則については、 選択ステートメントを参照してください。

CRTSQLxxx コマンドに DLYPRP(*NO) が指定されていると、以下の場合を除き、 権限の検査は該当のステートメントが準備される時点で行われます。

  • DROP SCHEMA ステートメントが準備済みの場合、スキーマの中の全オブジェクトに対する特権は、そのステートメントが実行されるまで検査されません。
  • DROP TABLE ステートメントが準備済みの場合、該当の表を参照するすべてのビュー、索引、および論理ファイルに対する特権は、そのステートメントが実行されるまで検査されません。
  • DROP VIEW ステートメントが準備済みの場合、そのビューを参照するすべてのビューに対する特権は、そのステートメントが実行されるまで検査されません。
  • CREATE TRIGGER ステートメントが準備済みの場合、トリガー・アクション で参照されるオブジェクトに対する特権は、ステートメントが実行されるまで検査されません。
  • FUNCTION、PROCEDURE、SEQUENCE、TYPE、TRIGGER、VARIABLE、または XSROBJECT ステートメントの DROP、COMMENT、または LABEL が準備済みの場合、権限は、そのステートメントが実行されるまで検査されません。
  • GRANT または REVOKE ステートメントが準備済みの場合、権限は、そのステートメントが実行されるまで検査されません。

CRTSQLxxx コマンドに DLYPRP(*YES) が指定されている場合、該当のステートメントが実行されるか、 または OPEN ステートメントで使用されるまで、権限の検査はすべて据え置かれます。

ステートメントの権限 ID は、 プログラムが作成されたときに CRTSQLxxx コマンドに USRPRF(*OWNER) および DYNUSRPRF(*OWNER) が 指定された場合を除いて、実行時の権限 ID です。詳しくは、権限 ID と権限名を参照してください。

ステートメントでグローバル変数を参照する場合は、ステートメントの権限 ID が保持する特権に、少なくとも次のいずれか 1 つが含まれなければなりません。

  • ステートメント内で識別されるグローバル変数に対して、
    • そのグローバル変数に対する READ 特権
    • そのグローバル変数を含むライブラリーに対する *EXECUTE システム権限
  • データベース管理者権限

構文

構文図を読む構文図をスキップする
>>-PREPARE--statement-name-------------------------------------->

>--+-----------------------------------------------------------------+-->
   |          .-SQL-.              .-LOCAL--.                        |   
   '-+-USING--+-----+--DESCRIPTOR--+--------+--SQL-descriptor-name-+-'   
     |                             '-GLOBAL-'                      |     
     '-INTO----descriptor-name----+-------------------------+------'     
                                  '-USING--+-NAMES--------+-'            
                                           +-SYSTEM NAMES-+              
                                           +-LABELS-------+              
                                           +-ANY----------+              
                                           +-BOTH---------+              
                                           '-ALL----------'              

>--+-FROM--+-variable---+--------------------------------+-----><
   |       '-expression-'                                |   
   '-+---------------------------+--FROM--+-variable---+-'   
     '-ATTRIBUTES--attr-variable-'        '-expression-'     

構文図を読む構文図をスキップする
attribute-string

   .--------------------------------------------------------.       
   V                                                        | (1)   
|----+----------------------------------------------------+-+------|
     +-+-ASENSITIVE-------------+-------------------------+         
     | +-INSENSITIVE------------+                         |         
     | |            .-DYNAMIC-. |                         |         
     | '-SENSITIVE--+---------+-'                         |         
     +-+-NO SCROLL-+--------------------------------------+         
     | '-SCROLL----'                                      |         
     +-+-WITHOUT HOLD-+-----------------------------------+         
     | '-WITH HOLD----'                                   |         
     +-+-WITHOUT RETURN-------------+---------------------+         
     | |              .-TO CALLER-. |                     |         
     | '-WITH RETURN--+-----------+-'                     |         
     |                '-TO CLIENT-'                       |         
     +-offset-clause--------------------------------------+         
     +-fetch-first-clause---------------------------------+         
     +-+-read-only-clause-+-------------------------------+         
     | '-update-clause----'                               |         
     +-optimize-clause------------------------------------+         
     +-isolation-clause-----------------------------------+         
     +-concurrent-access-resolution-clause----------------+         
     +-+-WITHOUT EXTENDED INDICATORS-+--------------------+         
     | '-WITH EXTENDED INDICATORS----'                    |         
     '-+-WITHOUT ROW CHANGE COLUMNS---------------------+-'         
       '-WITH ROW CHANGE COLUMNS--+-POSSIBLY DISTINCT-+-'           
                                  '-ALWAYS DISTINCT---'             

注:
  1. 同じ文節を複数回指定することはできません。オプションが指定されていない場合には、関連付けられた DECLARE CURSOR ステートメントおよび準備済み SELECT ステートメントのオプションに指定されているものがそのデフォルトとなります。

説明

statement-name
準備済みステートメントの名前を指定します。 この名前に、既存の準備済みステートメントを指定すると、 その準備済みステートメントは次の場合に破棄されます。
  • そのステートメントが同じプログラムの同じインスタンス内で準備された場合。
  • 両方のステートメントに関連した CRTSQLxxx コマンドに CLOSQLCSR(*ENDJOB)、 CLOSQLCSR(*ENDACTGRP)、 または CLOSQLCSR(*ENDSQL) が指定されている場合。
この名前に、プログラムの同じインスタンスの中のオープン・カーソルに関連する SELECT ステートメントを指定してはなりません。
USING SQL DESCRIPTOR SQL-descriptor-name
SQL 記述子を識別します。USING が指定されると、PREPARE ステートメントが正常に実行されたときに、準 備済みステートメントに関する情報が、SQL 記述子名 で指定した SQL 記述子内に入ります。したがって、次の PREPARE ステートメントは、
   EXEC SQL PREPARE S1 USING SQL DESCRIPTOR :sqldescriptor FROM :V1;

上記のステートメントは、次のステートメントと同等です。

   EXEC SQL PREPARE S1 FROM :V1;
   EXEC SQL DESCRIBE S1 USING SQL DESCRIPTOR :sqldescriptor;
LOCAL
記述子の名前の有効範囲はプログラム呼び出しのローカルであることを指定します。
GLOBAL
記述子の名前の有効範囲は SQL セッション全体であることを指定します。
SQL-descriptor-name
SQL 記述子の名前を指定します。名前は、指定の有効範囲を持つ既存の記述子を識別するものでなければなりません。

SQL 記述子に入る情報の説明については、GET DESCRIPTORを参照してください。

INTO
INTO を使用すると、PREPARE ステートメントが正常に実行されたときに、準 備済みステートメントに関する情報が、記述子名 で指定した SQLDA 内に入ります。 したがって、次の PREPARE ステートメントは、
   EXEC SQL PREPARE S1 INTO :SQLDA FROM :V1;

上記のステートメントは、次のステートメントと同等です。

   EXEC SQL PREPARE S1 FROM :V1;
   EXEC SQL DESCRIBE S1 INTO :SQLDA;
descriptor-name
SQL 記述子域 (SQLDA) を指定します。これについては、SQLDA (SQL 記述子域)で説明しています。PREPARE ステートメントを実行する前に、SQLDA に次の変数を設定しておく必要があります。(REXX の場合の規則は異なります。 詳しくは、「組み込み SQL プログラミング」トピック集を参照してください。):
SQLN
SQLVAR によって表される変数の個数を示します。 (SQLN によって、SQLVAR 配列の大きさ (エレメント数) が指定されます。) SQLN は PREPARE ステートメントの実行に先立ってゼロよりも大きいか、または等しい値に設定しなければなりません。 必要なオカレンスの数を決定する手法については、必要な SQLVAR オカレンスの数の決定を参照してください。

SQLDA に入れられる情報の説明については、DESCRIBEを参照してください。

USING
SQLDA のそれぞれの SQLNAME 変数に、どのような値を割り当てるかを 指定します。要求した値が存在しない場合または名前が 30 より長い場合、SQLNAME の長さは 0 にセットされます。
NAMES
列の名前を割り当てます。これはデフォルトです。準備されたステートメントで名前がその選択リストに明示的に指定されている場合、 指定されたそれらの名前が戻されます。
SYSTEM NAMES
列のシステム列名を割り当てます。
LABELS
列のラベルを割り当てます。(列のラベルは、LABEL ステートメントによって定義されます。) ラベルの最初の 20 バイトだけが戻されます。
ANY
列のラベルを割り当てます。列がラベルを持たない場合、ラベルとして列名が使用されます。
BOTH
列のラベルと名前の両方を割り当てます。この場合、追加情報に応じ るために、1 つの列ごとに SQLVAR の 2 つから 3 つのオカレンスが必要になり ますが、その数は、結果セットに特殊タイプが入っているか否かによって決 まります。この拡張の SQLVAR 配列を指定するには、SQLN を 2*n か 3*n (この場合の n は、表やビュー内の列数) に設定します。 SQLVAR の最初の n 個のオカレンスには、列の名前が入り、 2 番目または 3 番目の n オカレンスには、列のラベルが含まれます。 特殊タイプがない場合、SQLVAR 項目の 2 番目のセットにそのラベルが戻されます。 それ以外の場合、ラベルは、SQLVAR 項目の 3 番目のセット内に戻されます。

同じ SQLDA を以後の FETCH ステートメントで使用する場合には、 その PREPARE が完了したあと、SQLN を n に設定してください。

ALL
ラベル、列名、およびシステム列名を割り当てます。この場合、追加情報に応じるために、 1 つの列ごとに SQLVAR の 3 つから 4 つのオカレンスが必要になりますが、その数は、 結果セットに特殊タイプが入っているか否かによって決まります。この拡張の SQLVAR 配列を指定するには、SQLN を 3*n か 4*n (この場合の n は、結果表内の列数) に設定します。 SQLVAR の最初の n オカレンスには、システム列名が入ります。 2 番目または 3 番目の n オカレンスには、列のラベルが含まれます。 列名がシステム列名とは異なる場合、列名は 3 番目または 4 番目の n オカレンスに含まれます。 特殊タイプが指定されていない場合、ラベルは、SQLVAR 記入項目の 2 番目のセット内に戻され、 列名は、SQLVAR 記入項目の 3 番目のセット内に戻されます。 それ以外の場合、ラベルは、SQLVAR 記入項目の 3 番目のセット内に戻され、列名は、 SQLVAR 記入項目の 4 番目のセット内に戻されます。

同じ SQLDA を以後の FETCH ステートメントで使用する場合には、 その PREPARE が完了したあと、SQLN を n に設定してください。

ATTRIBUTES attr-variable
対応する属性が、関連付けられた SELECT ステートメントの最外部の全選択の一部として指定されていない場合に、このカーソルに有効な属性を指定します。属性が最外部の全選択に指定されている場合、それらは PREPARE ステートメント上で指定された対応する属性の代わりに使用されます。逆に、属性が PREPARE ステートメントに指定されている場合、DECLARE CURSOR ステートメントに指定された対応する属性の代わりにそれらの属性が使用されます。

作成したステートメントが select-statement ではない場合、USE CURRENTLY COMMITTED および WAIT FOR OUTCOME 以外のすべての属性は無視されます。

attr-variable は、ストリング変数の宣言に関する規則に従ってプログラム内で宣言される、文字ストリングまたは Unicode グラフィック変数を識別する必要があります。属性変数 は、長さ属性が VARCHAR の最大長を超えない ストリング変数 (固定長または可変長のいずれか) でなければなりません。 先頭ブランクおよび末尾ブランクは、変数の値から除去されます。 変数には、有効な属性ストリング が含まれている必要があります。

標識変数を使用して、属性が PREPARE ステートメント上に実際に指定されているかどうかを示すことができます。このようにして、属性を指定する必要があるかどうかには関係なく、 アプリケーションは同じ PREPARE ステートメントを使用できます。 attribute-string の一部として指定できるオプションは以下のとおりです。
ASENSITIVE、SENSITIVE、または INSENSITIVE
カーソルが変更に対して反応を決めない、反応する、または反応しないことを指定します。 詳しくは、DECLARE CURSORを参照してください。

SENSITIVE を指定した場合、FETCH FIRST 文節 は指定できません。 INSENSITIVE を指定した場合、UPDATE 文節 は指定できません。

NO SCROLL または SCROLL
カーソルがスクロール可能かどうかを指定します。詳しくは、DECLARE CURSORを参照してください。
WITHOUT HOLD または WITH HOLD
コミット操作の結果として、カーソルがクローズされるのを防止するかどうかを指定します。 詳しくは、DECLARE CURSORを参照してください。
WITHOUT RETURN または WITH RETURN
カーソルの結果表をプロシージャーから戻される結果セットとして使用するかどうか指定します。 詳しくは、DECLARE CURSORを参照してください。
変更の始まりoffset-clause変更の終わり
変更の始まり行が取得される前にスキップする行の数を指定します。 詳しくは、offset-clauseを参照してください。 offset-row-count は定数でなければなりません。

offset-clause を指定した場合、update-clause は指定できません。

変更の終わり
fetch-first-clause
最大数の行を検索するように指定します。 詳しくは、FETCH FIRST 文節を参照してください。 変更の始まりfetch-first-row-count は定数でなければなりません。変更の終わり

FETCH FIRST 文節 を指定した場合、UPDATE 文節 は指定できません。

READ-ONLY 文節 または UPDATE 文節
結果表が読み取り専用であるか更新可能であるかを指定します。 UPDATE 文節 は、列名なしで指定する必要があります (FOR UPDATE)。 詳しくは、READ-ONLY 文節、および UPDATE 文節を参照してください。
optimize-clause
データベース・マネージャーが、プログラムが整数 で指定された行数を超えて 結果表から検索を行う意図はないことを想定するように指定します。 詳しくは、OPTIMIZE 文節を参照してください。
isolation-clause
SELECT ステートメントを実行する分離レベルを指定します。 詳しくは、ISOLATION 文節を参照してください。
concurrent-access-resolution-clause
SELECT ステートメントで使用する並行アクセスの解決方法を指定します。詳しくは、concurrent-access-resolution-clauseを参照してください。
WITHOUT EXTENDED INDICATORS または WITH EXTENDED INDICATORS
INSERT または UPDATE の実行中に標識変数に指定された値が NULL 値を示すための標準 SQL セマンティクスに従っているかどうか、または拡張機能を使用して DEFAULT または UNASSIGNED 値の割り当てを示すことができるかどうかを指定します。
WITH EXTENDED INDICATORS を指定する必要があるのは、このステートメントが INSERT ステートメントの VALUES 形式を使用する INSERT である場合、UPDATE ステートメントである場合、またはこのステートメントに INSERT ステートメントの VALUES 形式を使用する INSERT が含まれる場合のみです。
WITHOUT ROW CHANGE COLUMNSWITH ROW CHANGE COLUMNS POSSIBLY DISTINCT 、または WITH ROW CHANGE COLUMNS ALWAYS DISTINCT
準備された選択ステートメント の結果セットに列を追加するかどうかを指定します。この列は後で、その行の列の値が変更された可能性があるかどうかを識別するために使用できます。 この行変更列は、単一の表 (または更新可能ビュー) が最外部の副選択で参照される場合にのみ追加されます。 DESCRIBE および GET DESCRIPTOR ステートメントは、どの行が追加されたかを示します。
WITHOUT ROW CHANGE COLUMNS
行変更列は、結果セットには追加されません。これはデフォルトです。
WITH ROW CHANGE COLUMNS POSSIBLY DISTINCT
行変更列は、単一の行を一意的に表していない場合でも結果セットに追加されます。 追加された列を使用して、その行の列の値が最初に取り出された後に変更された可能性があるかどうかを判別することができます。
  • 行変更列の値が最初の取り出し以降に変更されていない場合は、その行のどの列も最初の取り出し以降に変更されていません。
  • 行変更列の値が最初の取り出し以降に変更された場合は、行変更値が単一の行を表しているかどうかが確実ではないため、その行の列は変更された可能性も、変更されていない可能性もあります。
WITH ROW CHANGE COLUMNS ALWAYS DISTINCT
行変更列は、単一の行を一意的に表している場合にのみ結果セットに追加されます。 そうでない場合、行変更列は結果セットに追加されません。 追加された列を使用して、その行の列の値が最初の取り出し以降に変更されたかどうかを判別することができます。 (行の行変更列が確実に単一の行を一意的に識別するには、表に行変更タイム・スタンプ列が必要となることに注意してください。)
  • 行変更列の値が最初の取り出し以降に変更されていない場合は、その行のどの列も最初の取り出し以降に変更されていません。
  • 行変更列の値が最初の取り出し以降に変更された場合、その行の列は変更されています。
WITH ROW CHANGE COLUMNS ALWAYS DISTINCT が指定され、データベース・マネージャーが特殊な行変更列を返すことができない場合は、警告が返されます (SQLSTATE 0168T)。
FROM
ステートメント・ストリングを指定します。ステートメント・ストリングは、指定されるストリング式、 または変数 の値です。
variable
variable を識別します。この変数は、文字ストリングまたは Unicode グラフィック変数の宣言に関する規則に従ってプログラム内で宣言されます。この変数に、標識変数を指定してはなりません。
expression
集約関数または列名を含まない、で説明されているタイプの。 これは、文字ストリングまたは Unicode グラフィック・ストリングの 値を戻す必要があります。 の中に 変数が指定される場合、その変数の CCSID は 65535 であってはなりません。1

ステートメント・ストリング は、以下の SQL ステートメントのいずれかである必要があります。

ステートメント・ストリングは、次のようなストリングであってはなりません。

  • EXEC SQL で始める。
  • END-EXEC またはセミコロンで終了する。
  • 変数への参照を含むストリング。グローバル変数を使用できます。

パラメーター・マーカー: ステートメント・ストリングには変数への参照を入れることはできませんが、パラメーター・マーカー を含めることはできます。パラメーター・マーカーは、準備されたステートメントの実行時点で、変数の値によって置き換えられます。 パラメーター・マーカーは疑問符 (?) で表し、そのステートメント・ストリングが静的 SQL ステートメントで あった場合に変数を使用することができる個所で使用します。パラメーター・マーカーが、 値によってどのように置き換えられるかについては、OPENおよび EXECUTEを参照してください。

パラメーター・マーカーには、次の 2 つのタイプがあります。

型付きパラメーター・マーカー
ターゲット・データ・タイプが一緒に指定されているパラメーター・マーカー。 その汎用形式は、次のとおりです。
   CAST(? AS データ・タイプ)
この表記は関数呼び出しではありませんが、実行時のそのパラメーターのタイプが指定のデータ・タイプになるか、指定のデータ・タイ プに変換できるデータ・タイプになることを「約束」します。 例えば、次の場合、
  UPDATE EMPLOYEE
    SET LASTNAME = TRANSLATE(CAST(? AS VARCHAR(12)))
   WHERE EMPNO = ?
TRANSLATE 関数の引数の値は、実行時に提供されます。その値のデータ・タイプは、VARCHAR(12)、あるいは VARCHAR(12) に 変換できるデータ・タイプになります。 詳しくは、CAST の指定を参照してください。
型なしパラメーター・マーカー
ターゲット・データ・タイプが指定されていないパラメーター・マーカー。その形式は、単一の疑問符 (?) です。 型なしパラメーター・マーカーのデータ・タイプは、コンテキストによって提供されます。例えば、上記の更新ステートメントの述部にある型なしパラメーター・マーカーは、EMPNO 列のデータ・タイプと同じになります。

タイプ付きパラメーター・マーカーは、変数がサポートされており、 データ・タイプが CAST 関数の約束に基づいていれば、動的 SQL ステートメント内のどこでも使用できます。

型なしパラメーター・マーカーは、変数がサポートされている場合、動的 SQL ステートメント内の選択された場所で使用できます。使用する場所とその結果のデータ・タイプを、以下の表にまとめます。
表 1. 式における型なしパラメーター・マーカーの使用 (選択リスト、CASE、および VALUES を含む)
型なしパラメーター・マーカーの場所 データ・タイプ
副照会内でない選択リストで単独で使用 エラー
EXISTS 副照会内の選択リストで単独で使用 エラー
副照会内の選択リストで単独で使用 副照会の他のオペランドのデータ・タイプ。3
変更の始まりoffset-clauseoffset-row-count として単独で使用。変更の終わり 変更の始まりBIGINT変更の終わり
変更の始まりfetch-first-clausefetch-first-row-count として単独で使用。変更の終わり 変更の始まりBIGINT変更の終わり
単一算術演算子の両方のオペランド (演算子優先順位と演算順序の規則を考慮して)
次の場合も含まれます。
   ? + ? + 10
DECFLOAT(34)
算術式 (日時式は除く) の単一演算子の一方のオペランド
次の場合も含まれます。
   ? + ? * 10
他方のオペランドのデータ・タイプ。
単位タイプが SECONDS 以外の、日時式内の ラベル付き期間。(ラベル付き期間のうち、単位のタイプを示す部分はパラメーター・マーカーにできません) DECIMAL(15,0)
単位タイプが SECONDS の、日時式内の ラベル付き期間。(ラベル付き期間のうち、単位のタイプを示す部分はパラメーター・マーカーにできません) DECIMAL(27,12)
日時式のその他のオペランド (例えば、'timecol + ?' や '? - datecol') エラー
CONCAT 演算子の両オペランドとして使用。 DBCLOB(1G) CCSID 1200
他のオペランドが CLOB 以外の文字データ・タイプである場合に、CONCAT 演算子の 1 つのオペランドとして使用。 他のオペランドと同じ CCSID の VARCHAR(32740)
他のオペランドが DBCLOB 以外のグラフィック・データ・タイプである場合に、CONCAT 演算子の 1 つのオペランドとして使用。 他のオペランドと同じ CCSID の VARGRAPHIC(16370)
他のオペランドが BLOB 以外のバイナリー・タイプである場合に、CONCAT 演算子の 1 つのオペランドとして使用。 VARBINARY(32740)
他のオペランドがラージ・オブジェクト・ストリングである場合に、CONCAT 演算子の 1 つのオペランドとして使用。 他のオペランドのデータ・タイプと同じ。
CASE 式の CASE キーワードの後の式 型なしパラメーター・マーカー以外の WHEN キーワードの後の式に対して、結果のデータ・タイプに関する規則を適用した結果。
CASE 式 (単純および検索) 内の結果式の少なくとも 1 つ。残りの結果式は、型なしパラメーター・マーカーか NULL のどちらかである場合。 エラー
単純 CASE 式内の WHEN の後の任意または全部の式 CASE の後の式と、型なしパラメーター・マーカーでない WHEN の後の式に対して、結果のデータ・タイプに関する規則 を適用した結果。
CASE 式 (単純と検索の両方) 内の結果式。その式の少なくとも 1 つの結果式が、非 NULL で、型なしパラメーター・マーカーでもない場合。 NULL または型なしパラメーター・マーカー以外のすべての結果式に対して、結果のデータ・タイプに関する規則を適用した結果。
INSERT ステートメントの中になく、MERGE ステートメントの挿入操作の VALUES 文節内にない単一行の VALUES 文節で、column-expression として単独で使用。 エラー
INSERT ステートメント内になく、他のすべての行式 で同じ位置にある列式 が型なしパラメーター・マーカーである複数行 VALUES 文節の列式 として単独で。 エラー
INSERT ステートメント内になく、他の行式 のうちの少なくとも 1 つで同じ位置にある列式 が型なしパラメーター・マーカーでも NULL でもない複数行 VALUES 文節の列式 として単独で。 型なしパラメーター・マーカー以外のすべてのオペランドに 結果のデータ・タイプに関する規則を適用した結果。
INSERT ステートメント内の単一行 VALUES 文節で列式 として単独で使用。 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、ユーザー定義特殊タイプのソース・データ・タイプ。3
INSERT ステートメント内の複数行 VALUES 文節で列式 として単独で使用。 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、ユーザー定義特殊タイプのソース・データ・タイプ。3
MERGE ステートメントのソース表の VALUES 文節で、列式 として単独で使用 エラー
MERGE ステートメントの挿入操作の VALUES 文節で、列式 として単独で使用。 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、ユーザー定義特殊タイプのソース・データ・タイプ。3
MERGE ステートメントの更新操作の場合に、割り当て文節の右側で、列式 として単独で使用。 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、ユーザー定義特殊タイプのソース・データ・タイプ。3
UPDATE ステートメントの SET 文節の右側の値として単独で使用。 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、ユーザー定義特殊タイプのソース・データ・タイプ。3
INSERT ステートメントの複数行の挿入 の中の値として INTEGER
SET 特殊レジスター・ステートメントの右側の値として 特殊レジスターのデータ・タイプ。
関連付けられた式がグローバル変数である VALUES INTO ステートメントの VALUES 文節内の値として グローバル変数のデータ・タイプ。
VALUES INTO ステートメントの INTO 文節内の値として 関連式のデータ・タイプ。 3
FREE LOCATOR または HOLD LOCATOR ステートメントの中の値として ロケーター
SET ENCRYPTION PASSWORD ステートメントの中のパスワードの値として VARCHAR(128)
SET ENCRYPTION PASSWORD ステートメントの中のヒントの値として VARCHAR(32)
表 2. 述部での型なしパラメーター・マーカーの使用法
型なしパラメーター・マーカーの場所 データ・タイプ
比較演算子または DISTINCT 述部の両方のオペランド VARGRAPHIC(16370) CCSID 1200
比較演算子 または DISTINCT 述部の一方のオペランド。他方のオペランドが、 非型付きパラメーター・マーカーまたは特殊タイプ以外の場合。 他方のオペランドのデータ・タイプ。3
比較演算子の一方のオペランド。他方のオペランドが特殊タイプの場合。 エラー
BETWEEN 述部のすべてのオペランド VARGRAPHIC(16370) CCSID 1200
BETWEEN 述部の 2 つのオペランド 唯一の非パラメーター・マーカーのデータ・タイプと同じ。
BETWEEN 述部の 1 つのみのオペランド 型なしパラメーター・マーカー以外のすべてのオペランドに 結果のデータ・タイプに関する規則を適用した結果。ただし、CCSID 属性は、実行時に指定された値の CCSID になります。
IN 述部のすべてのオペランド。例えば、? IN (?,?,?) VARGRAPHIC(16370) CCSID 1200
IN 述部の第 1 オペランド。右側が全選択の場合 (例えば、? IN (全選択)) 選択された列のデータ・タイプ。
IN 述部の第 1 オペランド。右側が全選択でない場合 (例えば、? IN (?,A,B) または ? IN (A,?,B,?) など) . IN リスト内の、型なしパラメーター・マーカー以外のすべてのオペランド (IN キーワードの右側のオペランド) に対して、結果のデータ・タイプに関する規則を適用した結果。ただし、CCSID 属性は、実行時に指定された値の CCSID になります。
IN 述部の IN リストの任意または全部のオペランド (例えば、IN (?,B,?)) IN 述部の、型なしパラメーター・マーカー以外のすべてのオペランド (IN 述部の左右のオペランド) に対して、結果のデータ・タイプに関する規則を適用した結果。ただし、CCSID 属性は、実行時に指定された値の CCSID になります。
IN 述部の行値表現 の中の任意のオペランド。例えば、(c1,?) IN ... エラー
IN 述部で 行値表現 が指定される場合、副照会内の任意の選択リスト項目。例えば、(c1,c2) IN (SELECT ?, c1 FROM ...) エラー
LIKE 述部の 3 つのオペランドすべて 一致式 (オペランド 1) と パターン式 (オペランド 2) は VARCHAR(32740)。エスケープ式 (オペランド 3) は、 ジョブの CCSID の VARCHAR(1) 4
LIKE 述部の一致式。パターン式またはエスケープ式がタイプなしパラメーター・マーカーではない場合。 VARCHAR(32740)、VARGRAPHIC(16370)、または VARBINARY(32740) のいずれか。タイプなしパラメーター・マーカーではない第 1 オペランドのデータ・タイプによって決まります。CCSID は、 最初のオペランドの CCSID に基づきます。
LIKE 述部のパターン式。一致式またはエスケープ式がタイプなしパラメーター・マーカーではない場合。 VARCHAR(32740)、VARGRAPHIC(16370)、または VARBINARY(32740) のいずれか。タイプなしパラメーター・マーカーではない第 1 オペランドのデータ・タイプによって決まります。CCSID は、 最初のオペランドの CCSID に基づきます。

パターンの値の固定長変数の使用法については、LIKE 述部を参照してください。

LIKE 述部のエスケープ式。一致式またはパターン式が非型付きパラメーター・マーカーではない場合。 非型付きパラメーター・マーカー以外のすべてのオペランドに結果のデータ・タイプに関する規則を適用した結果に基づいて、VARCHAR(1) 4、VARGRAPHIC(1)、 または VARBINARY(1) のいずれか。CCSID も、これらの規則を適用した結果に基づきます。
NULL 述部のオペランド VARGRAPHIC(16370) CCSID 1200
表 3. 組み込み関数での型なしパラメーター・マーカーの使用法
型なしパラメーター・マーカーの場所 データ・タイプ
BITAND、 BITANDNOT、BITOR、BITXOR、BITNOT、
COALESCE、IFNULL、LAND、LOR、MIN、 MAX、NULLIF、VALUE、または XOR のすべての引数
エラー
少なくとも 1 つの引数が非型付きパラメーター・マーカー以外の、COALESCE、 IFNULL、LAND、LOR、MIN、MAX、
NULLIF、VALUE、または、XOR の引数。
タイプ無しパラメーター・マーカー以外のすべての引数に 結果のデータ・タイプに関する規則 を適用した結果。結果が特殊タイプの場合、エラーが戻されます。
他方の引数が非型付きパラメーター・マーカー以外の、BITAND、 BITANDNOT、BITOR、および BITXOR の引数。 他方の引数が SMALLINT、 INTEGER、または BIGINT の場合、他方の引数のデータ・タイプ。それ以外の場合は DECFLOAT(34)。
COMPARE_DECFLOAT、 DECFLOAT_SORTKEY、 NORMALIZE_DECFLOAT、 QUANTIZE、および TOTALORDER のすべての引数 DECFLOAT(34)
DAYNAME の第 1 引数 TIMESTAMP(12)
LOCATE、POSITION、または POSSTR の 2 つの引数 DBCLOB(1G) CCSID 1200
他の引数が文字データ・タイプの場合、LOCATE、POSITION、または POSSTR の 1 つの引数。 他方の引数の CCSID の VARCHAR(32740)
他の引数がグラフィック・データ・タイプの場合、LOCATE、POSITION、または POSSTR の 1 つの引数。 他方の引数の CCSID の VARGRAPHIC(16370)
他の引数が 2 進データ・タイプの場合、LOCATE、POSITION、または POSSTR の 1 つの引数。 VARBINARY(32740)
LOCATE_IN_STRING または OVERLAY の最初と 2 番目の引数の両方 DBCLOB(1G) CCSID 1200
他方のストリング引数が文字データ・タイプである場合、LOCATE_IN_STRING または OVERLAY の最初または 2 番目の引数 他方の引数の CCSID の VARCHAR(32740)
他方のストリング引数がグラフィック・データ・タイプである場合、LOCATE_IN_STRING または OVERLAY の最初または 2 番目の引数 他方の引数の CCSID の VARGRAPHIC(16370)
他方のストリング引数がバイナリー・データ・タイプである場合、LOCATE_IN_STRING または OVERLAY の最初または 2 番目の引数 VARBINARY(32740)
LOCATE_IN_STRING または OVERLAY の 3 番目または 4 番目の引数 INTEGER
LPAD または RPAD の 2 番目の引数 INTEGER
LPAD または RPAD の 3 番目の引数 VARCHAR(32740)
UPPER、LOWER、UCASE、および LCASE の引数 DBCLOB(1G) CCSID 1200
MONTHNAME の第 1 引数 TIMESTAMP(12)
MONTHS_BETWEEN の最初の引数と 2 番目の引数として使用。 TIMESTAMP(12)
REGEXP_LIKE、REGEXP_INSTR、
REGEXP_SUBSTR、REGEXP_COUNT、および REGEXP_REPLACE の第 1 オペランド
DBCLOB(1G) CCSID 1200
REGEXP_LIKE、REGEXP_INSTR、
REGEXP_SUBSTR、REGEXP_COUNT、および REGEXP_REPLACE の第 2 オペランド
DBCLOB(32K) CCSID 1200
REGEXP_REPLACE の第 3 オペランド DBCLOB(32K) CCSID 1200
REGEXP_LIKE、REGEXP_COUNT、
REGEXP_INSTR、REGEXP_SUBSTR、および REGEXP_REPLACE の source-string オペランド
DBCLOB(32K) CCSID 1200
REGEXP_LIKE、REGEXP_COUNT、
REGEXP_INSTR、REGEXP_SUBSTR、および REGEXP_REPLACE の pattern-expression
DBCLOB(32K) CCSID 1200
REGEXP_REPLACE の replacement-string オペランド DBCLOB(32K) CCSID 1200
REGEXP_LIKE、REGEXP_COUNT、
REGEXP_INSTR、REGEXP_SUBSTR、および REGEXP_REPLACE の start オペランド
INTEGER
REGEXP_LIKE、REGEXP_COUNT、
REGEXP_INSTR、REGEXP_SUBSTR、および REGEXP_REPLACE の flags オペランド
VARCHAR(6)
REGEXP_INSTR、REGEXP_SUBSTR、および REGEXP_REPLACE の occurrence オペランド INTEGER
REGEXP_INSTR の return-option オペランド INTEGER
REGEXP_INSTR および REGEXP_SUBSTR の group オペランド INTEGER
SUBSTR (最初の引数) DBCLOB(1G) CCSID 1200
SUBSTR (2 番目と 3 番目の引数) INTEGER
TRANSLATE の最初の引数 エラー
TRANSLATE の 2 番目と 3 番目の引数 最初の引数が文字タイプの場合、VARCHAR(32740)。最初の引数がグラフィック・タイプの場合、VARGRAPHIC(16370)。CCSID は、 最初の引数の CCSID に基づきます。
TRANSLATE の 4 番目の引数 最初の引数が文字タイプの場合、VARCHAR(1)。最初の引数がグラフィック・タイプの場合、VARGRAPHIC(1)。CCSID は、 最初の引数の CCSID に基づきます。
TIMESTAMP または TIMESTAMP_ISO の最初の引数 エラー
TIMESTAMP の 2 番目の引数 TIME
TIMESTAMP_FORMAT の最初の引数 VARGRAPHIC(16370) CCSID 1200
VARCHAR_FORMAT の最初の引数 TIMESTAMP(12)
TIMESTAMP_FORMAT または VARCHAR_FORMAT の第 2 引数 エラー
VERIFY_GROUP_FOR_USER の最初の引数より後のすべての引数 VARCHAR(128)
XMLVALIDATE の最初の引数 XML 5
XMLPARSE の最初の引数 CLOB(2G) または DBCLOB(1G)。照会オプション SQL_XML_DATA_CCSID の CCSID 値によって決まります。
XMLCOMMENT の最初の引数 VARCHAR(32740) または VARGRAPHIC(16370)。照会オプション SQL_XML_DATA_CCSID の CCSID 値によって決まります。
XMLTEXT の最初の引数 VARCHAR(32740) または VARGRAPHIC(16370)。照会オプション SQL_XML_DATA_CCSID の CCSID 値によって決まります。
XMLPI の 2 番目の引数 VARCHAR(36740) または VARGRAPHIC(16370)。照会オプション SQL_XML_DATA_CCSID の CCSID 値によって決まります。
XMLSERIALIZE の最初の引数 XML 6
XMLDOCUMENT のすべての引数 XML 5
XMLCONCAT のすべての引数 XML 5
XSLTRANSFORM の最初、2 番目、および 3 番目の引数 XML 6
ARRAY の配列指標 BIGINT
単項減算で使用。 DECFLOAT(34)
単項加算で使用。 DECFLOAT(34)
その他のすべてのスカラー関数のその他のすべての引数。 エラー
変更の始まりMEDIAN の引数変更の終わり 変更の始まりDECFLOAT(34)変更の終わり
変更の始まりCORRELATION、COVARIANCE、
COVARIANCE_SAMP、またはいずれかの回帰関数の第 1 または第 2 引数。変更の終わり
変更の始まり他方の引数が DECFLOAT の場合、DECFLOAT(34)。 それ以外の場合は、DOUBLE。変更の終わり
変更の始まりPERCENTILE_CONT または PERCENTILE_DISC の引数または ORDER BY 式変更の終わり 変更の始まりDECFLOAT(34)変更の終わり
変更の始まり他のすべての集約関数の引数変更の終わり 変更の始まりエラー変更の終わり
表 4. ユーザー定義ルーチンでの型なしパラメーター・マーカーの使用法
型なしパラメーター・マーカーの場所 データ・タイプ
関数の引数 関数の作成時に定義された、パラメーターのデータ・タイプ
プロシージャーの引数 プロシージャーの作成時に定義された、パラメーターのデータ・タイプ

エラー検査: PREPARE ステートメントが実行されると、 ステートメント・ストリングが解析され、エラーがないか検査されます。 ステートメント・ストリングが無効な場合は、準備済みステートメントは作 成されず、エラーが戻されます。

ローカルおよびリモート処理では、DLYPREP(*YES) オプションを指定すると 、一部の SQL ステートメントで「遅延」エラーを受け取ることがあります。 例えば、DESCRIBE、EXECUTE、および OPEN で、通常は PREPARE 処理中に 出される SQLCODE を受け取ることがあります。

参照および実行の規則: 準備済みステートメントは、以下のようなステートメントから参照 できます (ただし、ステートメントによっては、参照できる準備済みステ ートメントが制約されることがあります)。

ステートメント          準備済みステートメントの制約事項
DESCRIBE                なし
DECLARE CURSOR          カーソルがオープンされているときは SELECT する必要がある。
EXECUTE                 SELECT してはならない。

準備済みステートメントは、何度でも実行することができます。 準備済みステートメントを一度しか実行せず、ステートメントの中でパラメ ーター・マーカーも使用しない場合は、PREPARE ステートメントと EXECUTE ステートメントを使用するより、EXECUTE IMMEDIATE ステートメントを使用 した方が効率的です。

拡張標識の使用法: EXTENDED INDICATORS 節 は、拡張標識変数値が UPDATE ステートメントの SET 割り当て文節、INSERT ステートメントの VALUES 式リスト、 または MERGE ステートメントの挿入操作または更新操作において使用可能かどうかを 示します。

拡張標識変数とエラー検査の据え置き: 拡張標識変数が使用可能な場合、UNASSIGNED 標識変数値により、ステートメントから確実にそのターゲット列が除外されます。 このため、通常はステートメント準備中に行われる妥当性検査は、ステートメントの実行時まで遅延されます。

準備済みステートメントの持続性: 準備済みステートメントはすべて、次の場合に破棄されます。 7

  • CONNECT (タイプ 1) ステートメントが実行された場合。
  • 準備済みステートメントが関連する接続が、DISCONNECT ステートメントにより切り離された場合。
  • 準備済みステートメントが解除保留の接続に関連し、正常なコミットが行われた場合。
  • SQL ステートメントに関連した有効範囲 (ジョブ、活動化グループ、ま たはプログラム) が終了した場合。

ステートメントの有効範囲: statement-name の有効範囲は、それが定義されているソース・プログラムです。準備済みステートメントを他の SQL ステートメントから参照できるのは、 その SQL ステートメントが PREPARE ステートメントによってプリコンパイルされたものである場合だけです。 例えば、別にコンパイルされた他のプログラムから呼び出されたプログラムは、 呼び出し側プログラムによって作成された準備済みステートメントを使用することができません。

また、ステートメント名の有効範囲は、そのステートメントを含むプログラムが実行しているスレッドに限定されます。 例えば、同じジョブの中にある別々の 2 つのスレッドで同じプログラムが実行している場合、2 番目のスレッドは、 最初のスレッドが準備したステートメントを使用することができません。

ステートメントが定義されているプログラムがそのステートメントの有効範囲ですが、 そのプログラムから作成された各パッケージはそれぞれ準備されたステートメントの別個のインスタンスを含み、 実行時に準備されたステートメントが複数存在することがあります。例えば、CONNECT (タイプ 2) ステートメントを使用して、 次の順序でロケーション X とロケーション Y に接続するプログラムを想定します。

   EXEC SQL CONNECT TO X;
   EXEC SQL PREPARE S FROM :hv1;
   EXEC SQL EXECUTE S;
   .
   .
   .
   EXEC SQL CONNECT TO Y;
   EXEC SQL PREPARE S FROM :hv1;
   EXEC SQL EXECUTE S;

S の 2 番目の準備は、Y で S の別個のインスタンスを準備します。

CRTSQLxxx コマンドに CLOSQLCSR(*ENDJOB)、CLOSQLCSR(*ENDACTGRP)、または CLOSQLCSR(*ENDSQL) が 指定されていない場合、準備済みステートメントを参照できるのは、プログラム・スタックにある プログラムの同一のインスタンスに制限されます。

  • CLOSQLCSR(*ENDJOB) が指定されている場合、 プログラム・スタックにあるそのプログラム (ステートメントを準備したプログラム) の どのインスタンスでも準備済みステートメントを参照できます。この場合、 準備済みステートメントはジョブの終わりに破棄されます。
  • CLOSQLCSR(*ENDSQL) が指定されている場合、 プログラム・スタック内の最後の SQL プログラムが終了するまでの間、 プログラム・スタックにあるそのプログラム (ステートメントを準備したプログラム) のどのインスタンスでも、 準備済みステートメントを参照できます。 この場合、準備済みステートメントはプログラム・スタックの最後の SQL プログラムが終了すると破棄されます。
  • CLOSQLCSR(*ENDACTGRP) が指定されている場合、その活動化グループが終了するまでは、 そのステートメントを準備したプログラムのモジュールのすべてのインスタンスで、その準備済みステートメントを参照できます。 この場合、準備済みステートメントは活動化グループが終了すると破棄されます。

SQL 記述子の割り振り: USING 文節が指定される場合、PREPARE ステートメントを実行する前に、ALLOCATE DESCRIPTOR ステートメントを使用して SQL 記述子を割り振らなければなりません。 割り振られた記述子項目の数が結果列の数よりも小さい場合、警告 (SQLSTATE 01005) が戻されます。

PREPARE および *LIBL: 通常、オブジェクトの非修飾名は、ステートメントが準備される際に解決されます。 したがって、ステートメントが準備された後に CURRENT SCHEMA または CURRENT PATH が変更されても、ステートメントの実行またはオープン時にどのオブジェクトが参照されるかに対しては影響しません。 ただし、システム名が使用され、オブジェクト名が *LIBL で暗黙に修飾されている場合、オブジェクトは実行時またはオープン時に解決されます。 ステートメントが準備された後、ただし、実行時またはオープン時より前にライブラリー・リストが変更されると、ステートメントの実行時またはオープン時にどのオブジェクトが参照されるかに影響します。

例 1: COBOL プログラムで、選択ステートメント 以外のステートメントを準備して実行します。 このステートメントは、変数 HOLDER に入っているものとします。プ ログラムでは、ユーザーからの何らかの指示に基づいて、変数 HOLDER にステートメント・ストリングを入れます。準備するステートメントには、パラメーター・マーカーは入っていません。

   EXEC SQL  PREPARE STMT_NAME FROM :HOLDER  END-EXEC.

   EXEC SQL  EXECUTE STMT_NAME  END-EXEC.

例 2: 例 1 と同様に、選択ステートメント 以外のステートメントを準備して実行し ますが、準備するステートメントには、任意の数のパラメーター・マーカー を含めることができるものとします。

   EXEC SQL  PREPARE STMT_NAME FROM :HOLDER  END-EXEC.

   EXEC SQL  EXECUTE STMT_NAME USING DESCRIPTOR :INSERT_DA  END-EXEC.

以下のステートメントを準備するものとします。

   INSERT INTO DEPARTMENT VALUES(?, ?, ?, ?)

部門番号 G01、部門名 COMPLAINTS、管理者なし、報告先部門は部門 A00 という行を挿入するとすれば、 EXECUTE ステートメントを実行する前に、構造体 INSERT_DA には次のような値が入っていなければなりません。

INSERT_DA 構造体

1 PL/I プログラム内では、PL/I ストリング 式も指定できます。
2 SET 変数ステートメント のターゲットはグローバル変数である必要があります。
3 データ・タイプが DATE、TIME、または TIMESTAMP の 場合、VARCHAR(32740) が使用されます。
4 エスケープ式 が MIXED データの場合、データ・タイプは VARCHAR(4) です。
5 XML の CCSID は、 XML 値で説明されているように決定されます。
6 CCSID は、CAST の指定で説明されているように、AS 節に指定された data-type の属性に基づいて 決定されます。 data-type がバイナリー・ストリングまたはビット・データの場合、SQL_XML_DATA_CCSID が CCSID 属性に使用されます。
7 準備済みステートメントは、キャッシュに入れて、実際に破棄しないことも可能です。 ただし、キャッシュに入れたステートメントは、同一のステートメントを 再度準備するときにしか使用できません。