S-JIS[2010-07-24] 変更履歴

EXECUTE IMMEDIATE

OraclePL/SQLのEXECUTEで、SQLを実行することが出来る。


パラメーターなしのSQL実行

EXECUTE IMMEDIATE SQL文の文字列;

SQL文の文字列を指定することで、そのSQLを実行する。


begin
	EXECUTE IMMEDIATE 'truncate table テーブル名';
end;
--変数にSQL文を書いて実行する例
declare
	sql_stmt	varchar2(200);
begin
	sql_stmt := 'truncate table テーブル名';

	EXECUTE IMMEDIATE sql_stmt;
end;

パラメーターを渡すSQL実行

EXECUTE IMMEDIATE SQL文の文字列 USING 値…;

USING句を指定することで、SQL文内のバインド変数に値をセットすることが出来る。


begin
	EXECUTE IMMEDIATE 'update EMP set SAL = SAL + :1'
	USING 100;
end;
--変数の使用例
declare
	bonus	number;
begin
	bonus := 100;

	EXECUTE IMMEDIATE 'update EMP set SAL = SAL + :1'
	USING bonus;
end;
--複数パラメーターの例
begin
	EXECUTE IMMEDIATE 'update EMP set SAL = SAL + :1 where SAL < :2'
	USING 10, 12000;
end;

SQL*Plusのバインド変数を使用する例

SQL> var v1 number
SQL> var v2 varchar2(10)

SQL> exec :v1 := 10;
SQL> exec :v2 := 'SCOTT';

SQL> begin
  2   EXECUTE IMMEDIATE 'update EMP set SAL = SAL + :1 where ENAME = :2'
  3   USING :v1, :v2;
  4  end;
  5  /

SELECT実行(INTO)

EXECUTE IMMEDIATE SELECT文の文字列 INTO 変数名…;

INTO句を指定することで、SELECT文の実行結果を変数にセットすることが出来る。


SQL> var v1 number
SQL> var v2 varchar2(10)
SQL> var v3 number

SQL> exec :v2 := 'SCOTT';

SQL> begin
  2   EXECUTE IMMEDIATE 'select EMPNO,SAL from EMP where ENAME=:1'
  3   INTO :v1, :v3 USING :v2;
  4  end;
  5  /

SQL> print
        V1
----------
      7788

V2
--------------------------------
SCOTT

        V3
----------
     12932

値を返すSQL実行(RETURNING)

EXECUTE IMMEDIATE SQL文の文字列 RETURNING BULK COLLECT INTO 変数名;

RETURNING句を指定することで、値を返すSQL文の実行結果を変数にセットすることが出来る。


declare
	type NumberList is table of number(4);
	empnos NumberList;
begin
	EXECUTE IMMEDIATE 'update EMP set SAL=SAL+1 where ENAME=:1 returning EMPNO into :2'
	USING 'SCOTT'
	RETURNING BULK COLLECT INTO empnos;
end;

PL/SQLへ戻る / Oracle目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま