EXECUTE IMMEDIATE解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块。它的动态创建和执行 SQL语句性能超前。
使用技巧
1、EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交
假如通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分。假如通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据。
2、 EXECUTE IMMEDIATE不支持返回多行的查询,这种交互将用临时表来存储记录或者用REF 游标。
3、当执行SQL语句时,后面不要加分号,当执行PL/SQL块时,需要在其尾部用分号。
4、下面的例子展示了可能用到的Execute immediate的几个方面,希望能够在开发中为你带来方便。
EXECUTE IMMEDIATE用法例子
1、在PL/SQL运行DDL语句
begin
execute immediate 'set role all';
end;
2、给动态语句传值(USING 子句)
declare
l_depnam varchar2(20) := 'testing';
l_locvarchar2(10) := 'Dubai';
begin
execute immediate 'insert into dept values(:1, :2, :3)'
using 50, l_depnam, l_loc;
commit;
end;
3、 从动态语句检索值(INTO子句)
declare
l_cntvarchar2(20);
begin
execute immediate 'select count(1) from emp'
into l_cnt;
dbms_output.put_line(l_cnt);
end;
4、动态调用存储过程
例程中用到的绑定变量参数必须指定参数类型.黓认为IN类型,其它类型必须显式指定
declare
l_routin varchar2(100) := 'gen2161.get_rowcnt';
l_tblnam varchar2(20) := 'emp';
l_cntnumber;
l_status varchar2(200);
begin
execute immediate 'begin ' l_routin '(:2, :3, :4); end;'
using in l_tblnam, out l_cnt, in out l_status;
if l_status != 'OK' then
dbms_output.put_line('error');
end if;
end;
5、 将返回值传递到PL/SQL记录类型
同样也可用%rowtype变量
declare
type empdtlrec is record (empnonumber(4),
enamevarchar2(20),
deptnonumber(2));
empdtl empdtlrec;
begin
execute immediate 'select empno, ename, deptno '
'from emp where empno = 7934'
into empdtl;
end;
6、传递并检索值
INTO子句应当用在USING子句之前
declare
l_deptpls_integer := 20;
l_nam varchar2(20);
l_loc varchar2(20);
begin
execute immediate 'select dname, loc from dept where deptno = :1'
into l_nam, l_loc
using l_dept ;
end;
7、 多行查询选项
对此选项用insert语句填充临时表,用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾.
declare
l_sal pls_integer := 2000;
begin
execute immediate 'insert into temp(empno, ename) '
'select empno, ename from emp '
'wheresal :1'
using l_sal;
commit;
end;
对于处理动态语句,EXECUTE IMMEDIATE比以前可能用到的更轻易并且更高效,当意图执行动态语句时,适当地处理异常更加重要。应该关注于捕捉所有可能的异常。
PS:以上内容摘自他人的CSDN博客。
分享到:
相关推荐
oracle动态sql之EXECUTE IMMEDIATE.docx
它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用...
NULL 博文链接:https://wushuangyan26.iteye.com/blog/1306094
用execute immediate 执行备份恢复SQLSVR数据库
execute immediate str_sql into tabtcn; --动态执行DDL语句
ORACLE 培训 动态SQL编写 EXECUTE IMMEDIATE用法 DBMS_SQL用法
整理的Oracle数据库游标使用大全 ...较好的PL/SQL程序设计是在PL/SQL块中使用象DBMS_SQL这样的内建包或执行EXECUTE IMMEDIATE命令建立动态SQL来执行DDL命令,PL/SQL编译器保证对象引用以及用户的权限。。。。。。
动态PL/SQL用法例子 begin execute immediate 'create table test_qiu(id number)'; end;
如果需要在pl/sql 程序中使用动态sql,建议使用execute immediate 对于非常大的表,考虑使用表和索引的分区 如果需要在创建索引的时候减少所需时间,可以在会话集设置比较大的sort_area_size 考虑更多的使用decode...
execute immediate v_sql into v_count; p_OutRecordCount := v_count; ----执行分页查询 v_heiRownum := p_PageNo * p_PageSize; v_lowRownum := v_heiRownum - p_PageSize + 1; v_sql := 'SELECT * FROM ...
execute immediate sql_str into trow using tid; --将查询的结果给trow,查询语句中用到的参数使用tid替换 dbms_output.put_line('编号:'||trow.id||',名称:'||trow.name); end; drop table newTypes --PL/...
§1.10 使用SQL Worksheet工作 46 第二章 查询基础 50 §2.1 SELECT语句 50 §2.2 SQL中的单记录函数 50 §2.2.1 单记录字符函数 50 §2.2.2 单记录数字函数 56 §2.2.3 单记录日期函数 62 §2.2.4 单记录转换函数 ...
An intent lock indicates that SQL Server wants to acquire a shared (S) lock or exclusive (X) lock on some of the resources lower down in the hierarchy. For example, a shared intent lock placed at the ...
如果直接执行SQL语句或者参数绑定则不用担心太多, 如以下ORACLE存储过程 create or replace ... 例如工程师经常用的DBMS_SQL或者EXECUTE IMMEDIATE 看以下存储过程 create or replace procedure kjdate
在Oracle中若删除一个不存在的表,如 “DROP TABLE tableName”,则会提示: ORA-00942:表或视图不存在 若在程序中执行该语句则会报异常,这就需要...EXECUTE IMMEDIATE 'DROP TABLE tableName'; END IF; END; 在Oracle中
§1.10 使用SQL Worksheet工作 46 第二章 查询基础 50 §2.1 SELECT语句 50 §2.2 SQL中的单记录函数 50 §2.2.1 单记录字符函数 50 §2.2.2 单记录数字函数 56 §2.2.3 单记录日期函数 62 §2.2.4 单记录转换函数 ...
在ORACLE数据库杀掉会话进程有三种方式: 1:ALTER SYSTEM KILL SESSION ...SQL> ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE Specify IMMEDIATE to instruct Oracle Database to roll back on
第一种:不设置输出格式参数,即用默认的 SQL> create or replace procedure sql_explain(v_sql varchar2) ... 7 execute immediate 'explain plan for '||v_sql; 8 open explain_cursor fo
linux oracle 12c 自动启动.docx Oracle12c2 开机自动启动 触发器 SQL> create or replace trigger open_pbds ... 4 execute immediate 'ALTER PLUGGABLE DATABASE ALL OPEN'; 5 end open_pdbs; 6 /