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.