PREPARE ステートメントは、SQL ステートメントの動的な実行を準備するために、 アプリケーション・プログラムによって使用されます。 PREPARE ステートメントは、 ステートメント・ストリング と呼ばれる文字ストリング形式のステートメントから、 準備済みステートメント と呼ばれる実行可能な SQL ステートメントを作成します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、動的に準備できない実行可能ステートメントです。
許可
ステートメントの準備時に許可検査が行われるステートメント (DML) の場合、 ステートメントの許可 ID の特権には、 PREPARE ステートメントで指定されている SQL ステートメントの実行に必要な特権が含まれていなければなりません。 ステートメントの実行時に許可検査が行われるステートメント (DDL、GRANT、および REVOKE ステートメント) の場合、 このステートメントを使用するために必要な許可は特にありません。 ただし、準備済みステートメントの実行時にその許可が検査されます。
構文
>>-PREPARE--statement-name----+------------------------+--------> '-INTO--descriptor-name--' >----FROM--host-variable---------------------------------------><
説明
パラメーター・マーカーは疑問符 (?) で表されます。 ステートメント・ストリングが静的 SQL ステートメントであった場合、 パラメーター・マーカーは、ホスト変数を記述できる場所に宣言します。 パラメーター・マーカーがどのように値で置き換えられるかについては、 OPEN と EXECUTE を参照してください。
パラメーター・マーカーには、以下の 2 つのタイプがあります。
CAST(? AS data-type)
この表記は関数呼び出しではなく、 実行時のパラメーター・タイプが指定のデータ・タイプであること、 または指定のデータ・タイプに変換できるデータ・タイプであることを「保証」するものです。 たとえば、
UPDATE EMPLOYEE SET LASTNAME = TRANSLATE(CAST(? AS VARCHAR(12))) WHERE EMPNO = ?
TRANSLATE 関数の引き数の値は、実行時に与えられます。 その値のデータ・タイプは、VARCHAR(12)、または VARCHAR(12) に変換可能なタイプになるはずです。
タイプ付きパラメーター・マーカーは、動的 SQL ステートメントで、 ホスト変数がサポートされている場所であれば、どこにでも使用でき、 そのデータ・タイプは CAST 関数で行った保証に基づきます。
タイプなしパラメーター・マーカーは、動的 SQL ステートメントで、 ホスト変数がサポートされている位置の中から選択された位置で使用できます。 それらの位置と結果データ・タイプを、表 28 に示しています。 この表で、位置は、式、述部、および関数に類別されており、 タイプなしパラメーター・マーカーが使用可能か否かを容易に調べることができます。 非修飾関数名の関数 (算術演算子、CONCAT、 および日付 / 時刻演算子を含む) にタイプなしパラメーター・マーカーを使用する場合、 関数解決の目的で、その修飾子は 'SYSIBM' に設定されます。
タイプなしパラメーター・マーカーの位置 | データ・タイプ |
---|---|
式 (選択リスト、CASE、VALUES を含む) | |
選択リストに単独で | エラー |
演算子の優先順位と演算順序規則の分析後に、
単一算術演算子のオペランドの両方となる位置
例: ? + ? + 10 | エラー |
日付 / 時刻の式以外の算術式の単一演算子のオペランドのいずれか一方
例: ? + ? * 10 | もう一方のオペランドのデータ・タイプ。 |
日付 / 時刻の式のラベル付き期間 (ラベル付き期間の単位のタイプを示す部分には、 パラメーター・マーカーを使用できません。) | DECIMAL(15,0) |
日付 / 時刻の式のその他のオペランド ('timecol + ?' または '? - datecol'). | エラー |
CONCAT 演算子の 2 つのオペランド | エラー |
CONCAT 演算子の 1 つのオペランド (もう一方のオペランドが CLOB 以外の 文字データ・タイプである場合) | 一方のオペランドが CHAR(n) または VARCHAR(n) (n は 128 より小さい) の場合、 もう一方のオペランドは VARCHAR(254 - n)。 その他のすべての場合のデータ・タイプは VARCHAR(254)。 |
CONCAT 演算子の 1 つのオペランド (もう一方のオペランドが DBCLOB 以外の文字データ・タイプである場合) | 一方のオペランドが GRAPHIC(n) または VARGRAPHIC(n) の場合 (n は 64 より小さい)、 もう一方のオペランドは VARCHAR(127 - n)。 その他のすべての場合のデータ・タイプは VARCHAR(127)。 |
CONCAT 演算子の 1 つのオペランド (もう一方のオペランドがラージ・オブジェクト・ストリングである場合) | もう一方のオペランドと同じ。 |
UPDATE ステートメントの SET 文節の右側の値 | 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、 そのユーザー定義特殊タイプのソース・データ・タイプ。 その列がユーザー定義の構造タイプとして定義されている場合は、構造タイプ。 これは変形関数の戻りタイプも示している。 |
単純な CASE 式の CASE に続く式 | エラー |
結果式の残りがタイプなしパラメーター・マーカーまたは NULL のいずれかである CASE 式 (単純および探索) の結果式の少なくとも 1 つ | エラー |
単純 CASE 式の WHEN の後のいずれかまたはすべての式 | タイプなしパラメーター・マーカー以外の CASE の後の式および WHEN の後の式に 結果のデータ・タイプに関する規則を適用した結果。 |
NULL でもタイプなしパラメーター・マーカーでもない結果式が少なくとも 1 つある CASE 式 (単純および探索) の結果式 | 結果式のうち NULL でもタイプなしパラメーター・マーカーでもないものすべてに、 "結果のデータ・タイプに関する規則"を適用した結果。 |
INSERT ステートメント内にない単一行 VALUES 文節の列式として単独で | エラー |
INSERT ステートメント内になく、 他のすべての行式での同じ位置にある列式がタイプなしパラメーター・マーカーである複数行 VALUES 文節の列式として単独で | エラー |
INSERT ステートメント内になく、 他の行式のうちの少なくとも 1 つで同じ位置にある式がタイプなしパラメーター・マーカーでも NULL でもない複数行 VALUES 文節の列式として単独で | タイプなしパラメーター・マーカー以外のすべてのオペランドに結果のデータ・タイプに関する規則を適用した結果。 |
INSERT ステートメント内にある単一行 VALUES 文節の列式として単独で | 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、 そのユーザー定義特殊タイプのソース・データ・タイプ。 その列がユーザー定義の構造タイプとして定義されている場合は、構造タイプ。 これは変形関数の戻りタイプも示している。 |
INSERT ステートメント内にある複数行 VALUES 文節の列式として単独で | 列のデータ・タイプ。 その列がユーザー定義特殊タイプとして定義されている場合は、 そのユーザー定義特殊タイプのソース・データ・タイプ。 その列がユーザー定義の構造タイプとして定義されている場合は、構造タイプ。 これは変形関数の戻りタイプも示している。 |
SET 特殊レジスター・ステートメントの右側にある値として | 特殊レジスターのデータ・タイプ。 |
述部 | |
比較演算子の両方のオペランド | エラー |
比較演算子の一方のオペランド (もう一方のオペランドはタイプなしパラメーター・マーカー) | もう一方のオペランドのデータ・タイプ |
BETWEEN 述部のすべてのオペランド | エラー |
BETWEEN 述部の
オペランド | もう一方のオペランドと同じ。 |
その他の BETWEEN の場合 (タイプなしパラメーター・マーカーが 1 個だけの場合など) | タイプなしパラメーター・マーカー以外のすべてのオペランドに結果のデータ・タイプに関する規則を適用した結果。 |
IN 述部のすべてのオペランド | エラー |
IN 述部の第 1 オペランドと第 2 オペランドの両方 | IN リストのオペランド (IN キーワードの右側のオペランド) のうち、 タイプなしパラメーター・マーカー以外のすべてのオペランドに"結果のデータ・タイプに関する規則"を適用した結果。 |
IN 述部の第 1 オペランド (右側が全選択の場合) | 選択した列のデータ・タイプ。 |
IN 述部の IN リストのいずれかまたはすべてのオペランド | IN 述部のオペランド (IN 述部の左右のオペランド) のうち、 タイプなしパラメーター・マーカー以外のすべてのオペランドに結果データ・タイプに関する規則を適用した結果。 |
IN リストの第 1 オペランドと、それ以外のオペランドのゼロ個以上 | IN リストのオペランド (IN キーワードの右側のオペランド) のうち、 タイプなしパラメーター・マーカー以外のすべてのオペランドに"結果のデータ・タイプに関する規則"を適用した結果。 |
LIKE 述部の 3 つのオペランドすべて | 一致式 (オペランド 1) とパターン式 (オペランド 2) は VARCHAR(32672)。 エスケープ式 (オペランド 3) は VARCHAR(2)。 |
LIKE 述部の一致式 (パターン式またはエスケープ式のいずれかが、 タイプなしパラメーター・マーカー以外である場合) | 第 1 オペランド (タイプなしパラメーター・マーカー) に応じて、 VARCHAR(32672) または VARGRAPHIC(16336) のいずれか。 |
LIKE 述部のパターン式 (一致式またはエスケープ式のいずれかが、 タイプなしパラメーター・マーカー以外である場合) | 第 1 オペランド (タイプなしパラメーター・マーカー) に応じて、 VARCHAR(32672) または VARGRAPHIC(16336) のいずれか。 一致式のデータ・タイプが BLOB の場合、 パターン式のデータ・タイプは BLOB(32672) とみなされます。 |
LIKE 述部のエスケープ式 (一致式またはパターン式のいずれかが、 タイプなしパラメーター・マーカー以外である場合) | 第 1 オペランド (タイプなしパラメーター・マーカー) に応じて、 VARCHAR(2) または VARGRAPHIC(1) のいずれか。 一致式またはパターン式のデータ・タイプが BLOB の場合、 エスケープ式のデータ・タイプは BLOB(1) とみなされます。 |
NULL 述部のオペランド | エラー |
関数 | |
COALESCE (VALUE とも呼ばれる) または NULLIF のすべてのオペランド | エラー |
少なくとも 1 つのオペランドがタイプなしパラメーター・マーカー以外である COALESCE のオペランド。 | タイプなしパラメーター・マーカー以外のすべてのオペランドに 結果のデータ・タイプに関する規則を適用した結果。 |
もう一方のオペランドがタイプなしパラメーター・マーカー以外の NULLIF のオペランド。 | もう一方のオペランドのデータ・タイプ |
POSSTR (両方のオペランド) | 両方のオペランドは共に VARCHAR(32672)。 |
POSSTR の一方のオペランド (もう一方のオペランドが文字データ・タイプである場合) | VARCHAR(32672)。 |
POSSTR の 1 つのオペランド (もう一方のオペランドがグラフィック・データ・タイプである場合) | VARGRAPHIC(16336)。 |
POSSTR の探索ストリング・オペランド (もう一方のオペランドが BLOB である場合) | BLOB(32672)。 |
SUBSTR (第 1 オペランド) | VARCHAR(32672) |
SUBSTR (第 2 と第 3 のオペランド) | INTEGER |
TRANSLATE スカラー関数の第 1 オペランド | エラー |
TRANSLATE スカラー関数の第 2 と第 3 のオペランド | 第 1 オペランドが文字タイプの場合、VARCHAR(32672)。 第 1 オペランドがグラフィック・タイプの場合、VARGRAPHIC(16336)。 |
TRANSLATE スカラー関数の第 4 オペランド | 第 1 オペランドが文字タイプの場合、VARCHAR(1)。 第 1 オペランドがグラフィック・タイプの場合、VARGRAPHIC(1)。 |
TIMESTAMP スカラー関数の第 2 オペランド | TIME |
単項マイナス | DOUBLE PRECISION |
単項プラス | DOUBLE PRECISION |
ユーザー定義関数を含むその他のすべてのスカラー関数のその他のすべてのオペランド | エラー |
列関数のオペランド | エラー |
注
例
例 1: 選択ステートメント以外のステートメントを COBOL プログラムで準備して実行します。 そのステートメントはホスト変数 HOLDER に含まれ、 ユーザーによる何らかの指示に基づいて、 プログラムはそのステートメント・ストリングをそのホスト変数に入れるものと想定します。 準備するステートメントには、パラメーター・マーカーは含まれていません。
EXEC SQL PREPARE STMT_NAME FROM :HOLDER END-EXEC. EXEC SQL EXECUTE STMT_NAME END-EXEC.
例 2: 例 1 と同様に選択ステートメント以外のステートメントを準備しますが、 この例では、C プログラムにコーディングします。 また、準備するステートメントには、 いくつかのパラメーター・マーカーが含まれていると想定します。
EXEC SQL PREPARE STMT_NAME FROM :holder; EXEC SQL EXECUTE STMT_NAME USING DESCRIPTOR :insert_da;
以下のステートメントを準備するものと想定します。
INSERT INTO DEPT VALUES(?, ?, ?, ?)
DEPT 表の列は、以下のように定義されています。
DEPT_NO CHAR(3) NOT NULL, -- department number DEPTNAME VARCHAR(29), -- department name MGRNO CHAR(6), -- manager number ADMRDEPT CHAR(3) -- admin department number
部門長が存在せず、部門 A00 に報告を行う COMPLAINTS という名前の部門番号 G01 を挿入するには、 EXECUTE ステートメントを実行する前に、構造体 INSERT_DA は上記の値を持っていなければなりません。