Oracle EXECUTE IMMEDIATEコマンドを使用してSQL文を動的に実行
9384 ワード
Oracle EXECUTE IMMEDIATEコマンドを使用してSQL文を動的に実行
動的実行SQL文とは、まずSQLコマンドを文字列に保存し、execute immediateコマンドを使用して文字列のSQL文を動的に実行して、SQL文の動的生成を実現することです.
一、動的SQL文の使用方法
説明:(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、このストレージ・プロシージャを呼び出してデータ・テーブルを作成します.コードは次のとおりです.
ストアド・プロシージャを呼び出し、結果を表示します.
テーブル構造を表示するには、次の手順に従います.
2、動的クエリーを作成し、入力したパラメータに基づいて従業員の情報をクエリーする
ストアド・プロシージャのパラメータは従業員番号で、入力された従業員番号に基づいて従業員の名前と給与を問い合せます.コードは次のとおりです.
ストレージ・プロシージャを実行するには、次の手順に従います.
動的実行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.