動的なSQL文の準備と実行
アプリケーション・プログラムでは、ホスト変数の中に文字ストリングを指定するという形式で、動的に SQL ステートメントを作成することができます。 一般に、ステートメントは、アプリケーション・プログラムで利用可能なデータ (例えば、ワークステーションからの入力など) から作成されます。
非Java™言語では、 PREPAREとEXECUTEを使用したSQL文の動的実行で説明されているように、構築された文は、(埋め込まれた)PREPARE文によって実行の準備をし、(埋め込まれた)EXECUTE文によって実行することができます。 この代わりに、(組み込み) ステートメント EXECUTE IMMEDIATE を使って、1 ステップ でステートメントを準備して実行することもできます。 Javaでは、Statement、 PreparedStatement,、 CallableStatement クラスを使用してステートメントを実行準備することができ、それぞれのexecute()メソッドを使用して実行することができます。
を使用します。 Db2 for z/OS® ODBC を使用すると、SQLPrepare 関数を呼び出してステートメントを準備し、SQLExecute 関数を呼び出して実行することもできます。 どちらの場合も、そのアプリケーションは組み込みの PREPARE ステートメントまたは EXECUTE ステートメントを 含みません。 SQLExecDirect 関数にステートメントを渡せば、準備なしでステートメントを実行できる。 Introduction to Db2 ODBC このインターフェイスでサポートされるAPIについて説明する。
準備するステートメントには、ホスト変数に対する参照を含めてはなりません。 パラメーター・マーカーは含めることができます。 ( パラメータマーカー に関する規則については、PREPARE文の説明を参照してください。) 準備済みのステートメントが実行される時点で、パラメーター・マーカーは、 実際には EXECUTE ステートメントで指定されたホスト変数の現行値に置き換えられます。 (この置換に関するルールについては、EXECUTE文を参照してください。) ステートメントの準備が終わった後は、ホスト変数の異なる値を使って複数回実行することができます。 パラメーター・マーカーは、EXECUTE IMMEDIATE を使用して準備し、 実行される SQL ステートメントでは使えません。
Java 以外の言語の場合、ステートメントの実行が成功したか失敗したかは 、EXECUTE (または EXECUTE IMMEDIATE) ステートメントの後で、SQLCA 内 の SQLCODE フィールドおよび SQLSTATE フィールドに戻される値により示されます。 組み込みステートメントのところで前述したように、これらの フィールドの検査が必要になります。 Javaでは、ステートメントの実行が成功したか失敗したかは、Java例外によって処理されます。
| DYNAMICRULES 動作 | 特権セット |
|---|---|
| 実行動作 | 動的に準備されたステートメントが ALTER、CREATE、DROP、
GRANT、RENAME、または REVOKE ステートメント以外の場合、プロセスの各許可 ID が持つ特権セットの和集合。 動的 SQL ステートメントが CREATE、GRANT、または REVOKE ステートメントの場合、 プロセスの SQL 許可 ID または 1 次許可 ID のロール (プロセスが ROLE AS OBJECT OWNER 文節を使用して定義されたトラステッド・コンテキスト内で実行されている場合) が保持する特権。 |
| バインド動作 | パッケージまたはプラン所有者の 1 次許可 ID が持つ特権。 |
| 定義動作 | ストアード・プロシージャーまたはユーザー定義関数の所有者 (定義者) の許可 ID が持つ特権。 |
| 呼び出し動作 | ストアード・プロシージャーまたはユーザー定義関数の呼び出し側の許可 ID が持つ特権。 しかし、呼び出し側がプロセス の 1 次許可 ID または CURRENT SQLID 値である場合、 必要な許可に 2 次許可 ID が必要であれば、これらも検査されます。 したがって、このケースでは、特権セットはそれぞれの許可 ID またはロール (トラステッド・コンテキスト内で実行されている場合) が持つ特権セットの和集合になります。 |