Oracle中Execute Immediate用法

Oracle中Execute Immediate用法

Execute Immediate代替了以前Oracle8i中DBMS_SQL package包.
它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,
Execute Immediate的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.
尽管DBMS_SQL仍然可用,但是推荐使用Execute Immediate,因为它获的收益在包之上。

-- 使用技巧

1、Execute Immediate将不会提交一个DML事务执行,应该显式提交
   如果通过Execute Immediate处理DML命令,那么在完成以前需要显式
   提交或者作为Execute Immediate自己的一部分。如果通过Execute Immediate
   处理DDL命令,它提交所有以前改变的数据。

2、不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors。

3、当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号。

4、在Oracle手册中,未详细覆盖这些功能。
   下面的例子展示了所有用到Execute Immediate的可能方面。

5、对于Forms开发者,当在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能.

Execute Immediate -- 用法例子

1. 在PL/SQL运行DDL语句

begin
   execute immediate ‘set role all‘;
end;

2. 给动态语句传值(USING 子句)

declare
   l_depnam varchar2(20) := ‘testing‘;
   l_loc     varchar2(10) := ‘Dubai‘;
   begin
   execute immediate ‘insert into dept values   (:1, :2, :3)‘
     using 50, l_depnam, l_loc;
   commit;
end;

3. 从动态语句检索值(INTO子句)

declare
   l_cnt     varchar2(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_cnt       number;
   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 (empno   number(4),
                            ename   varchar2(20),
                            deptno   number(2));
   empdtl empdtlrec;
begin
   execute immediate ‘select empno, ename, deptno ‘ ||
                    ‘from emp where empno = 7934‘
     into empdtl;
end;

6. 传递并检索值.INTO子句用在USING子句前

declare
   l_dept     pls_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 ‘ ||
                    ‘           where   sal > :1‘
     using l_sal;
   commit;
end;

对于处理动态语句,、Execute Immediate 比以前可能用到的更容易并且更高效。
当意图执行动态语句时,适当地处理异常更加重要。应该关注于捕获所有可能的异常。

原文地址:https://www.cnblogs.com/lxm11/p/12054302.html

时间: 2024-12-09 17:40:50

Oracle中Execute Immediate用法的相关文章

Oracle 中 decode 函数用法

Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN(翻译值2) ......ELSIF 条件=值n THEN RETURN(翻译值n)ELSE RETURN(缺省值)END IFdecode(字段或字段的运算,值1,值2,值3) 这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值

Oracle中Cursor的用法

关键字 ?概念 ?类型 ?异常处理 一 概念 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率. 二  类型   Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cursor(动态Cursor). 1. 隐式Cursor: 1).对于Selec

oracle中to_date详细用法示例(oracle日期格式转换)

这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星期几.两个日期间的天数.月份差等用法 TO_DATE格式(以时间:2007-11-02 13:45:25为例) 1. 日期和字符转换函数用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串 select to_char(sysdate,'

Oracle中Merge into用法总结 (转载)

Oracle中Merge into用法总结 (出处:http://www.cnblogs.com/dongsheng/p/4384754.html) 起因: 前段时间,因为涉及到一张表的大数据操作,要同时进行增删改,我跟师傅想了很多优化办法,结果都不尽人意.刚开始用的就是原始算法,先更新现有记录,再插入满足要求的其他记录,最后再删除多余记录,但是少量数据还可以,10W条数据就不行了,前台的超时时间是60s,远远无法满足要求.之后又想办法将任务进行拆分,根据每条记录流水号尾字符不同进行拆分,用多个

【基础】ORACLE中substr的用法

ORACLE中substr函数的简单用法 substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串 substr('Hello World',1,1) //返回结果为 'H'  *0和1都是表示截取的开始位置为第一个字符 substr('Hello World',2,4) //返回结果为 'ello' substr('Hello World',-3,3)//返回结果

oracle中类似indexof用法_instr函数

[sql] 在oracle中没有indexof()函数 但是提供了一个 instr() 方法 具体用法: select instr('保定市南市区','市',1,1)-1 from dual; 解释:1. '保定市南市区' =>可以是表达式,也可以是具体数据 2. '市'=>为分离的标志,这里为两组数据中的“市”这个字 3. 第一个1为从左边开始,如果为-1,则从右边开始. 4. 第二个1为“市”出现的第几次. www.2cto.com 在GBK编码下,一个中文占两个字节 select ins

关于oracle中to_char的用法

昨天做的需求中用到了几个之前没做过的用法 关键词:to_char('xxxx'),to_number('xxx') 1.to_char将ORACLE中10进制数转换为16进制数. 事先录入的10进制数为number型 对lac_16字段做了如下的处理, lpad(trim(Upper(to_char(ac_ten, 'xxxx'))), 4, '0') lac_16,  使用trim的原因是 转换后的16进制数会为保留10进制数的长度 后对to_char的此用法进行了学习,为方便,使用了orac

oracle中Connect By用法介绍

为解决oracle中自连接查询不适合操作大表的情况,采用connect by 方式实现.oracle中可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 在结构化查询中应用. 基本语法: select ... from <TableName> where <Conditional1> connect by <Conditional2> start with <Conditional3> connect by

oracle中的truncate用法

oracle中的truncate 语法:TRUNCATE  TABLE  table; 在使用truncate语句(DDL语言)可以删除表中的所有记录.使用truncate语句删除数据时,通常要比使用delete语句快得多,这是因为使用truncate语句删除数据时,不会产生任何回退信息,因此执行truncate语句操作也不能回退,且使用的系统和事务日志资源少. DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项.TRUNCATE TABLE 通过释放存储表数据所用的数据页来删