oracle中execute immediate的使用

来源:互联网 发布:全球首个5g商用网络 编辑:程序博客网 时间:2024/06/06 01:05


原文出处:http://owen4751076.iteye.com/blog/354521


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_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比以前可能用到的更轻易并且更高效.当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕捉所有可能的异常.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 面盆下水口漏水怎么办 水龙头接口处漏水怎么办 洗脸池脸盆渗水怎么办 老小区水管漏水怎么办 脸盆漏水口漏水怎么办 花洒水管漏水怎么办 空调水管断了怎么办 空调水管有声音怎么办 洗衣机洗桶漏水怎么办 全自动洗衣机排水管漏水怎么办 ppr塑料水管漏水怎么办 空调出水管漏了怎么办 pvc管接口漏水怎么办 外墙下水管漏水怎么办 污水管缝漏水怎么办 铁管有个沙眼怎么办 卫生间边缝漏水怎么办 老铸铁水管漏水怎么办 厕所下水道管子漏水怎么办 外墙雨水管堵了怎么办 商品房子地基下沉怎么办 楼下的管道漏水怎么办 铁水管开关漏水怎么办 排污管堵了怎么办 水龙头换不下来怎么办 全自动洗衣机水龙头漏水怎么办 供暖被停了怎么办 马桶上水慢怎么办视频 马桶水箱烂了怎么办 马桶拉屎总是堵怎么办 雨伞的伞珠掉了怎么办 雨伞的卡扣坏了怎么办 陶瓷汤勺掉马桶怎么办 下水道突然堵了怎么办 猫砂堵住下水道怎么办 洗碗下面堵了怎么办 泥沙堵了下水道怎么办 下水道有点堵了怎么办 下水道堵砂石了怎么办 水泥堵了下水道怎么办 水槽下水道堵了怎么办