Oracle EXECUTE IMMEDIATEコマンドを使用してSQL文を動的に実行

9384 ワード

Oracle EXECUTE IMMEDIATEコマンドを使用してSQL文を動的に実行
動的実行SQL文とは、まずSQLコマンドを文字列に保存し、execute immediateコマンドを使用して文字列のSQL文を動的に実行して、SQL文の動的生成を実現することです.
一、動的SQL文の使用方法
DECLARE
           varchar2(n);        --            ,    SQL  
BEGIN
          :=SQL  ;            -- SQL           
    EXECUTE IMMEDIATE       
        using        
        returning into       ;;  --       SQL  
END;
/

説明:(1)EXECUTE IMMEDIATEはDMLトランザクションの実行をコミットしません.明示的にコミットする必要があります.(2)EXECUTE IMMEDIATEでDMLコマンドを処理する場合、完了する前に明示的なコミットが必要であり、EXECUTE IMMEDIATEでDDLコマンドを処理する場合、以前に変更されたすべてのデータをコミットする.(3)複数ローを返すクエリはサポートされておらず、このインタラクションは一時テーブルでレコードを格納したり、動的カーソルREF cursorsを使用したりすることができる.(4)SQL文を実行する場合はセミコロンは使用せず、PL/SQLブロックを実行する場合は末尾にセミコロンを使用する.
二、動的呼び出しSQL文の例
1、動的SQLによるDDL文の実行
ストレージ・プロシージャspの作成create_table、このストレージ・プロシージャを呼び出してデータ・テーブルを作成します.コードは次のとおりです.
SQL> 
create or replace procedure sp_create_table
as
    v_table_name varchar2(100);
    v_sql_str varchar2(500);
begin
    select 't'||to_char(sysdate,'yyyymmddhh24miss') 
        into v_table_name 
        from dual;
    v_sql_str:='create table '||v_table_name||'('||'
        id number(4) primary key,
        name varchar2(50),
        phone varchar2(20),
        addr varchar2(200)'||
        ')';
    execute immediate v_sql_str;
end;
 17  /

Procedure created.

ストアド・プロシージャを呼び出し、結果を表示します.
SQL> call sp_create_table();

Call completed.

SQL> select * from tab where tname like 'T2020%';

TNAME			       TABTYPE	CLUSTERID
------------------------------ ------- ----------
T20200217205344 	       TABLE
T20200217205804 	       TABLE

テーブル構造を表示するには、次の手順に従います.
SQL> desc T20200217205804;
 Name														   Null?    Type
-------------------------------- -------- ------------------------------------------------
 ID														   NOT NULL NUMBER(4)
 NAME															    VARCHAR2(50)
 PHONE															    VARCHAR2(20)
 ADDR															    VARCHAR2(200)

2、動的クエリーを作成し、入力したパラメータに基づいて従業員の情報をクエリーする
ストアド・プロシージャのパラメータは従業員番号で、入力された従業員番号に基づいて従業員の名前と給与を問い合せます.コードは次のとおりです.
SQL> 
create or replace procedure sp_get_emp
(v_empno number)
as
    v_ename varchar2(20);
    v_sal number(6);
    v_str varchar2(100);
begin
    v_str:='select ename,sal from emp where empno=:1';
    execute immediate v_str into v_ename,v_sal using v_empno;
    dbms_output.put_line('  :'||v_ename||',  :'||v_sal);
exception
    when no_data_found then
        dbms_output.put_line('     !');
end;
 15  /

Procedure created.

ストレージ・プロシージャを実行するには、次の手順に従います.
SQL> call sp_get_emp(2222);Call completed.

Elapsed: 00:00:00.01
SQL> call sp_get_emp(7788);
  :SCOTT,  :3011

Call completed.