Oracle使用EXECUTE IMMEDIATE命令動態執行SQL語句

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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章