トップページ >  PL/SQL > 動的SQL> 動的SQLで何ができる?
初版2009/08/25: 最終更新日2009/08/25
12-1.  動的SQLで何ができる?
目次
動的SQLとは
動的SQLで何ができる?
ネイティブ動的SQLサンプル
DBMS_SQLを利用した動的SQLサンプル
動的SQLとは
動的SQLとは文字通り、プログラムで動的くみ上げられたSQL文を指します。
処理実行時点ではテーブルが不確定の場合など、静的SQLでは処理が複雑になる場合に利用します。
動的SQLで何ができる?
例えば、プログラムの条件によってソート順が変わる場合は動的SQLの方が、処理を簡略化できます。
また、動的SQLのみで実行できるSQLが以下にあります。

DDL(データ定義言語)文 テーブルの作成や、破棄等
セッション制御言語文 (ALTER SESSION、SET ROLEなど)
ネイティブ動的SQLサンプル
DBMS_SQL より 1.5から3倍パフォーマンスが出ると言われていますが、実運用ではそれほどの差は無いようです。
また、ネイティブ動的SQLでは32kを超えるSQL文の実行は出来ません。※Oracle11gでは解消されているようです。
DECLARE
TYPE EmpCurTyp IS REF CURSOR;
// 変数宣言
v_emp_cursor EmpCurTyp;
v_stmt_str VARCHAR2(200);
v_name VARCHAR2(20);
v_salary NUMBER;
BEGIN
-- SQLの組み立て
v_stmt_str := 'SELECT ename, sal FROM emp WHERE job = :1';
-- カーソルを開く
OPEN v_emp_cursor FOR v_stmt_str USING 'SALESMAN';
-- 値を取得する為のループ
LOOP
-- 一行取り出し
FETCH v_emp_cursor INTO v_name, v_salary;
-- 取得できなければループ終了
EXIT WHEN v_emp_cursor%NOTFOUND ;
-- 処理を記述する
END LOOP;
-- カーソルを閉じる
CLOSE v_emp_cursor;
END;
DBMS_SQLを利用した動的SQLサンプル
ネイティブ動的SQLで実現できない32kを超えるSQL文の実行時はこちらを利用します。
実際の開発現場ではあまり利用する事は無いかもしれません。
DECLARE
// 変数宣言
v_stmt_str VARCHAR2(200);
v_cur_hdl INT;
v_rows_processed INT;
v_name VARCHAR2(10);
v_salary INT;
BEGIN
// カーソルを開く
v_cur_hdl := DBMS_SQL.OPEN_CURSOR;
-- SQLの組み立て
v_stmt_str := 'SELECT ename, sal FROM emp WHERE job = :g_jobname';
-- SQLの解析
DBMS_SQL.PARSE(v_cur_hdl,v_stmt_str,DBMS_SQL.NATIVE);
-- バインド変数に値を設定
DBMS_SQL.BIND_VARIABLE(v_cur_hdl, 'g_jobname','SALESMAN');
-- 列の設定
DBMS_SQL.DEFINE_COLUMN(v_cur_hdl, 1, v_name, 200);
DBMS_SQL.DEFINE_COLUMN(v_cur_hdl, 2, v_salary);
-- 実行
v_rows_processed := DBMS_SQL.EXECUTE(v_cur_hdl);
-- 値を取得する為のループ
LOOP
-- 一行取り出し
IF DBMS_SQL.FETCH_ROWS(v_cur_hdl) > 0 THEN
-- 列の値の取り出し
DBMS_SQL.COLUMN_VALUE(v_cur_hdl, 1, v_name);
DBMS_SQL.COLUMN_VALUE(v_cur_hdl, 2, v_salary);
-- 処理を記述する
ELSE
-- ループを終了
EXIT;
END IF;
END LOOP;
// カーソルを閉じる
DBMS_SQL.CLOSE_CURSOR(v_cur_hdl);
END;
PL/SQL