動的SQLは、アプリケーションの実行時に、SQL文を動的に指定することを可能にします。
ホストプログラムに直接SQL文を記述しないので、動的SQL文を使用すると、対話的に入力したSQL文を実行したり、ある情報から生成したSQL文を実行するアプリケーションを作成することができます。
アプリケーションの実行時に入力するSQL文を準備可能文といいます。準備可能文として扱うことのできるSQL文を以下に示します。なお、動的SELECT文は、カーソル宣言のカーソル指定に対応し、動的単一行SELECT文は、単一行SELECT文に対応します。
動的SELECT文
動的単一行SELECT文
DELETE文:探索
UPDATE文:探索
INSERT文
準備可能動的DELETE文:位置づけ
準備可能動的UPDATE文:位置づけ
スキーマ定義文
CREATE SCHEMA文(スキーマ定義)
CREATE TABLE文(表定義)
CREATE VIEW文(ビュー定義)
CREATE PROCEDURE文(プロシジャルーチン定義)
CREATE FUNCTION文(ファンクションルーチン定義)
CREATE SEQUENCE文(順序定義)
CREATE INDEX文(インデックス定義)
CREATE TRIGGER文(トリガ定義)
スキーマ操作文
DROP SCHEMA文(スキーマ削除文)
DROP TABLE文(表削除文)
ALTER TABLE文(表定義変更文)
DROP VIEW文(ビュー削除文)
DROP PROCEDURE文(プロシジャルーチン削除文)
DROP FUNCTION文(ファンクションルーチン削除文)
DROP SEQUENCE文(順序削除文)
DROP INDEX文(インデックス削除文)
DROP TRIGGER文(トリガ削除文)
SWAP TABLE文(表交換文)
格納構造定義文
CREATE DSO文(表のDSO定義文)
CREATE DSO文(インデックスのDSO定義文)
CREATE DSI文(表のDSI定義文)
CREATE DSI文(インデックスのDSI定義文)
CREATE SCOPE文(スコープ定義文)
格納構造操作文
DROP DSO文(DSO削除文)
DROP DSI文(DSI削除文)
ALTER DSI文(DSI変更文)
DROP SCOPE文(スコープ削除文)
APPLY SCOPE文(スコープ適用文)
RELEASE SCOPE文(スコープ解除文)
利用者制御文
CREATE USER文(利用者定義文)
DROP USER文(利用者削除文)
ALTER USER文(利用者変更文)
アクセス制御文
CREATE ROLE文(ロール定義文)
DROP ROLE文(ロール削除文)
GRANT文
REVOKE文
システム制御文
SET SYSTEM PARAMETER文
CALL文
準備可能文はPREPARE文で準備します。PREPARE文で準備されたSQL文を被準備文といいます。被準備文はPREPARE文で指定したSQL文識別子によって識別されます。被準備文が動的SELECT文の場合、動的カーソル宣言でカーソルを定義し、動的OPEN文、動的FETCH文、動的CLOSE文、動的DELETE文:位置づけおよび動的UPDATE文:位置づけで操作します。また、準備可能動的DELETE文:位置づけおよび準備可能動的UPDATE文:位置づけでも操作します。被準備文が動的単一行SELECT文、DELETE文:探索、UPDATE文:探索、INSERT文、準備可能動的DELETE文:位置づけ、または準備可能動的UPDATE文:位置づけの場合は、EXECUTE文で実行します。
被準備文に含まれる動的パラメタ指定の値の設定や行の値の取出しには、SQL記述子域、SQLDA構造体または引数を使用します。DESCRIBE文により被準備文の選択リストの情報や動的パラメタ指定の情報を、SQL記述子域またはSQLDA構造体に設定することができます。SQL記述子域の情報は、DESCRIPTOR取得文で取得し、DESCRIPTOR設定文で設定することができます。動的OPEN文およびEXECUTE文では、SQL記述子域、SQLDA構造体または引数を介して動的パラメタ指定の値を指定することができます。動的FETCH文および動的単一行SELECT文を被準備文とするEXECUTE文では、SQL記述子域、SQLDA構造体または引数を介して行の値を取り出すことができます。また、被準備文がDELETE文:探索、UPDATE文:探索、INSERT文、準備可能動的DELETE文:位置づけ、または準備可能動的UPDATE文:位置づけで、動的パラメタ指定を含まないときは、EXECUTE IMMEDIATE文で直接実行することができます。
さらに、被準備文がスキーマ定義文、スキーマ操作文、格納構造定義文、格納構造操作文の場合は、EXECUTE文またはEXECUTE IMMEDIATE文で実行することができます。
通常、動的SQLで指定するカーソル名やSQL文識別子は、識別子として静的に指定します。しかし、操作するカーソルの数や実行するSQL文の数が動的に変化する場合は、カーソル名やSQL文識別子を静的に指定することが困難です。この場合は、カーソル名やSQL文識別子をホスト変数で指定し、アプリケーションの実行時にカーソル名やSQL文識別子の値を動的に指定します。ホスト変数で指定するカーソル名を拡張カーソル名、SQL文識別子を拡張SQL文識別子といいます。拡張カーソル名でカーソルを定義する場合は、ALLOCATE CURSOR文を実行します。拡張カーソル名や拡張SQL文識別子を使用すると、動的OPEN文などのカーソル操作文やPREPARE文をカーソル名やSQL文識別子ごとに指定する必要がなくなり、共通化できます。このため、アプリケーションのコーディング量を削減する効果も期待できます。