Oracle使⽤EXECUTEIMMEDIATE命令动态执⾏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();
oracle游标的使用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.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论