動的SQLを使用するときには、必ずSQLDAを定義しなければなりません。
statement_nameは、18文字を超えてはなりません。
列式として指定するか、またはホスト変数として指定するかにかかわらず、動的SQL文は最大で32キロバイトまでの長さにすることができます (SQLテキスト、USINGデータ、およびパーセル オーバーヘッドを含めて)。
ホスト変数として指定する場合、そのステートメント文字列は、クライアント プログラミング言語用のSQL文字列のルールに従う必要があります。
言語 | statement_stringの形式 |
---|---|
COBOL | 非数値リテラル |
C | |
PL/I | 文字列式 |
- 単文リクエストまたは複文リクエストのいずれも可能
- EXEC文を組み込むことができる
- データを戻す文を組み込むことができる
文字列変数がVARCHARである場合、文のテキストは最大64Kにできる
- 以下のいずれのSQL文も指定することはできません。
ABORT EXECUTE IMMEDIATE BEGIN TRANSACTION FETCH CHECKPOINT LOGOFF CLOSE LOGON COMMIT OPEN CONNECT POSITION DESCRIBE PREPARE ECHO REWIND END TRANSACTION ROLLBACK EXECUTE - Preprocessor2宣言にはできません。
動的SQL文にはパラメータ マーカーまたはプレースホルダー トークン(疑問符)を使用することができ、ここでは任意の定数(特にホスト変数)参照が有効です。
OPEN文およびEXECUTE文のUSING句によって、値がその文に提供されます。
- 型付きプレースホルダーの場合、データ型が明示的にキャストされます。例えば、以下のUPDATE文では、part_noが型付きプレースホルダーです。
UPDATE parts SET part_no = (CAST(? AS INTEGER)) WHERE vendor_no = ?;
このアクションによって、変数のデータ型は、実行時にプレースホルダーにキャストされるタイプか、またはそのタイプに変換できるタイプに設定されます。
- 型なしプレースホルダーのデータ型は、文脈によって決定されます。
例えば、以下の文では、WHERE句内の型なしプレースホルダーのタイプはvendor_noのタイプと同じです。
UPDATE parts SET part_no = (CAST(? AS INTEGER) WHERE vendor_no = ?;
CASE式でTHEN/ELSE句の結果としてプレースホルダーを使用できるのは、CASE式内の少なくとも他の1つの結果がプレースホルダーでもNULLキーワードでもない場合に限ります。
- 単項演算子のオペランドとしての使用
例えば、+ ?は無効です。
- 2項演算子の両方のオペランドとしての使用
例えば、? + ?は無効です。
- 比較演算子の両方のオペランドとしての使用
例えば、以下のSELECT文は無効です。
SELECT * FROM table_name WHERE ? = ?
いずれかのプレースホルダーを0+で置き換えると、そのような値のもとではデータ型が数値であることが文脈によって明確に判別できるので、比較は有効になります。
同様に、比較において、対応する2つのフィールドを表わすようにプレースホルダーを使用することはできません。
例えば、以下のような場合、それぞれの対の最初の値のタイプがPREPARE時点で文脈から判別できず、不明であるため、この比較は無効です。
(?,X) > (?,Y)
ただし、以下の比較は有効です。これは、PREPARE時に文脈からタイプを判別できるためです。
(?,X) > (Y,?)
- POSITION関数の両方のオペランドとしての使用
- UPPER関数の唯一のオペランドとしての使用
- LOWER関数の唯一のオペランドとしての使用
- TRIM関数の2番目、または3番目のオペランドとしての使用
- EXTRACT関数のFROMオペランドとしての使用
- TRANSLATE関数の最初のオペランドとしての使用
- いずれかの集約関数の引数としての使用
- IS [NOT] NULLの左側のオペランドのいずれかの構成要素としての使用
- OVERLAPS比較のどちらかのオペランドの2番目の構成要素としての使用
- 単独の項目選択式としての使用
例えば、以下のSELECTは無効です。
SELECT ? AS alias_name FROM table_name;
ただし、以下のSELECT文は有効です。これは、SELECTリスト内の式全体としてではなく、式の一部としてプレースホルダーが使用されているためです。
SELECT 0 + ? AS alias_name FROM table_name;
- INTO句およびUSING句を使わずにPREPARE文を実行すること
- INTO句およびUSING句を使って準備済みの文に対してDESCRIBE文を実行すること
- PREPAREを動的SQL文として実行することはできません。