ORACLE SQL リファレンス(逆引き)

ORACLE SQL リファレンス

Web oracle.se-free.com
動的SQLでレコードを1件SELECTする(EXECUTE IMMEDIATE)
スポンサード リンク

動的SQLでDBからレコードを1件取得する場合はEXECUTE IMMEDIATEコマンドを使用します。

●SELECT文の場合
EXECUTE IMMEDIATE SELECT文 INTO 代入変数 USING バインド変数リスト

●INSERT/UPDATE/DELETE文の場合
EXECUTE IMMEDIATE SELECT文 USING バインド変数リスト


SELECTでDBから取得した、項目を、代入変数に代入します。
指定したバインド変数のリストに動的にSQL条件が変わる変数を設定します。
SELECTしたレコード件数が複数件の場合、または、0件の場合は、エラーが発生します。


例1) 表「emp」からSELECTした項目「emp_id」、項目「dept_id」、「name」をそれぞれ「v_emp_id」、「v_dept_id」、「v_name」に代入する。
検索条件を変数の「wk_emp_id」と「wk_dept_id」からホスト変数に動的に指定している。
declare

 v_emp_id emp.emp_id%type;
 v_dept_id emp.dept_id%type;
 v_name emp.name%type;

 wk_emp_id emp.emp_id%type;
 wk_dept_id emp.dept_id%type;

 sql_stmt varchar2(256);

begin

 wk_emp_id := 'E01';
 wk_dept_id := 'D01';

 sql_stmt := 'select emp_id,dept_id,name from emp 
    where emp_id = :emp_id and dept_id = :dept_id';

 -- バインド変数「emp_id」「dept_id」に変数「v_emp_id」「v_name」の値を設定
 execute immediate sql_stmt into v_emp_id,v_dept_id,v_name 
    using wk_emp_id,wk_dept_id;

 dbms_output.put_line('コード1:' || v_emp_id);
 dbms_output.put_line('コード2:' || v_dept_id);
 dbms_output.put_line('名前:' || v_name);

end;


例2) 表「emp」にレコードをinsertします。
insertするデータを、変数の「wk_emp_id」と「wk_dept_id」と「wk_name」からホスト変数に動的に設定している。
declare

 wk_emp_id char(3);
 wk_dept_id char(3);
 wk_name varchar2(10);

 sql_stmt varchar2(256);

begin

 dbms_output.enable(100000);

 wk_emp_id := 'E05';
 wk_dept_id := 'D05';
 wk_name := 'なまえ5';

 sql_stmt := 'insert into emp (emp_id,dept_id,name)
     values(:emp_id, :dept_id, :name)';

 execute immediate sql_stmt 
    using wk_emp_id,wk_dept_id,wk_name;

 commit;

end;

スポンサード リンク

レコードを1件SELECTする(SELECT〜INTO)
明示的カーソルでレコードを複数件SELECTする(CURSOR)
暗黙的カーソルでレコードを複数件SELECTする(CURSOR)
カーソルの属性
動的SQLでレコードを1件SELECTする(EXECUTE IMMEDIATE)
動的SQLでカーソルを使用してレコードを複数SELECTする(CURSOR)
コミット・ロールバック(COMMIT、ROLLBACK)

PL/SQL へ
忘れっぽいエンジニアのオラクルSQLリファレンス TOPへ