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

[经验分享] oracle动态sql语句处理

[复制链接]

尚未签到

发表于 2018-9-23 11:22:12 | 显示全部楼层 |阅读模式
动态SQL语句处理:根据要处理的sql语句的作用不同,可以使用三种不同类型的动态sql方法:使用execute immediate语句可以处理包括ddl(create、alter和drop)、DCL(grant、revoke)、DML(insert、update、delete)以及单行select语句;使用open cursorname for sql_statement语句可以处理多行查询操作;使用批量动态sql(forall)可以加快sql语句处理,进而提高plsql程序的性能。  *execute immediate语句:
  Execute immediate dynamic_string
  [into {define_variable[,define_variable]…|record}]
  [using [in|out|in out] bind_argument[,[in|out|in out] bind_argument]…]
  [{returning|return} into bind_argument[, bind_argument]…]
  Define_variable用于指定存放单行查询结果的变量;using in bind_argument用于指定存放传递给动态sql值的变量,即在dynamic中存在占位符时使用;using out bind_argument用于指定存放动态sql返回值的变量。
  示例1:使用execute immediate执行简单ddl语句
  begin
  executeimmediate'create table t11(f1 integer)';
  executeimmediate'drop table t11';
  end;
  示例2:使用execute immediate执行dcl语句
  begin
  executeimmediate'grant insert on t11 to scott'
  end;
  示例3:使用execute immediate处理dml语句时,如果dml语句包含占位符,那么在execute immediate语句之后必须要带有using子句;如果dml语句带有returning子句,那么在execute immediate语句之后必须带有returning into子句,并且此时只能处理作用的单行上的dml语句,如果dml语句作用在多行上,则必须使用bulk子句。
  declare
  af1 varchar2(10);
  af2 varchar2(10);
  af3 varchar2(10);
  begin
  af1 := 12;
  af2 := 'csdn';
  executeimmediate'update t11 set f2 = :af2 where f1 = :af1 returning f2 into :af3 '
  using af2,af1
  returninginto af3 ;
  dbms_output.put_line(af3);
  end;
  示例4:使用动态游标处理多行查询类动态sql语句。
  declare
  type myrefcursor isrefcursor;
  refcursor myrefcursor;
  rec_t11 t11%rowtype;
  begin
  open refcursor for'select * from t11';
  loop
  fetch refcursor into rec_t11;
  exitwhen refcursor%notfound;    dbms_output.put_line(rec_t11.f1||','||rec_t11.f2||','||rec_t11.f3);
  endloop;
  close refcursor;
  end;
  oracle通过使用bulk collect into子句处理动态sql中的多行查询可以加快处理速度,从而提高应用程序的性能。当使用bulk子句时,集合类型可以是plsql所支持的索引表、嵌套表和varray,但集合元素必须使用sql数据类型。在oracle9i以后,有三种语句支持bulk子句,execute immediate,fetch和forall。
  示例5:在execute immediate中使用bulk collect into处理多行查询返回结果。
  declare
  type t11_table_type istableof t11%rowtype;
  t11_table t11_table_type;
  af2 varchar2(10);
  begin
  af2 := '23';
  executeimmediate'select * from t11 where f2=:Af2'bulkcollectinto t11_table
  using af2;
  for i in1..t11_table.countloop    dbms_output.put_line(t11_table(i).f1||','||t11_table(i).f2||','||t11_table(i).f3);
  endloop;
  end;
  示例6:在forall语句中使用bulkinto语句。
  1          d          wang     12
  2          dsaf      wang     23
  3          asdf      wang     34
  4          liasdf    wang
  5          li          wang
  6          asdf      wang
  7          li          wang
  8          li          wang
  declare
  type type_t11_f1 istableof t11.f1%type;
  type type_t11_table istableof t11.f2%type;
  t11_F1 type_t11_f1;
  t11_table type_t11_table;
  begin
  t11_f1 := type_t11_f1('d','dsaf','asdf','liasdf','li','asdf');
  forall i in1..t11_f1.count
  executeimmediate'update t11 set f2 = f1||f2 where f1 = :p1 returning f2 into :p2'
  using t11_F1(i)
  returningbulkcollectinto t11_table;
  for i in t11_table.first..t11_table.lastloop
  dbms_output.put_line(t11_table(i));
  endloop;
  end;
  dwang
  dsafwang
  asdfwang
  asdfwang
  liasdfwang
  liwang
  liwang
  liwang
  asdfasdfwang
  asdfasdfwang


运维网声明 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.iyunv.com/thread-600212-1-1.html 上篇帖子: oracle表连接分析 下篇帖子: 删除Oracle归档日志方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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