设为首页 收藏本站
查看: 460|回复: 0

[经验分享] oracle中execute immediate的使用

[复制链接]

尚未签到

发表于 2016-7-30 17:42:52 | 显示全部楼层 |阅读模式
  EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非http://www.zoomino.cn/static-ox/images/z-keyword.gif运行时创建的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块时,在其尾部http://www.zoomino.cn/static-ox/images/z-keyword.gif用分号.
  4. 在Oracle手册http://www.zoomino.cn/static-ox/images/z-keyword.gif中,未具体覆盖这些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便.
  5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能http://www.zoomino.cn/static-ox/images/z-keyword.gif.
  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. 动态调用例程.例程中用到的绑定http://www.zoomino.cn/static-ox/images/z-keyword.gif变量http://www.zoomino.cn/static-ox/images/z-keyword.gif参数必须指定参数类型.黓认为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. 将返回值http://www.zoomino.cn/static-ox/images/z-keyword.gif传递到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纠正此缺憾http://www.zoomino.cn/static-ox/images/z-keyword.gif.
  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比以前可能用到的更轻易并且更高效.当意图http://www.zoomino.cn/static-ox/images/z-keyword.gif执行动态语句时,适当地处理异常更加重要.应该关注于捕捉所有可能的异常.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-251365-1-1.html 上篇帖子: ORACLE常用函数和数据类型 下篇帖子: Oracle 11g 分区表新特性
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表