转自:http://taosst.javaeye.com/blog/284770

  1. PL/SQL中使用动态SQL编程
  2. 在PL/SQL程序设计过程中,会遇到很多必须使用动态sql的地方,oracle系统所提供的DMBS_SQL包可以帮助你解决问题。
  3. (一)介绍
  4. DBMS_SQL 系统包提供了很多函数及过程,现在简要阐述其中使用频率较高的几种:
  5. function  open_cursor:打开一个动态游标,并返回一个整型;
  6. procedure  close_cursor(c  in   out   integer );关闭一个动态游标,参数为open_cursor所打开的游标;
  7. procedure  parse(c  in   integer , statement  in  varchar2, language_flag  in   integer ):对动态游标所提供的sql语句进行解析,参数C表示游标,statement为sql语句,language-flag为解析sql语句所用oracle版本,一般有V6,V7跟native(在不明白所连 database 版本时,使用native);
  8. procedure  define_column(c  in   integer , position  in   integer ,  column   any  datatype, [column_size  in   integer ]):定义动态游标所能得到的对应值,其中c为动态游标,positon为对应动态sql中的位置(从1开始), column 为该值所对应的变量,可以为任何类型,column_size只有在 column 为定义长度的类型中使用如VARCHAR2, CHAR 等(该过程有很多种情况,此处只对一般使用到的类型进行表述);
  9. function   execute (c  in   integer ):执行游标,并返回处理一个整型,1表示成功,0表示失败,代表处理结果(对 insert , delete , update 才有意义,而对 select 语句而言可以忽略);
  10. function  fetch_rows(c  in   integer ):对游标进行循环取数据,并返回一个整数,为0时表示已经取到游标末端;
  11. procedure  column_value(c  in   integer , position  in   integer , value):将所取得的游标数据赋值到相应的变量,c为游标,position为位置,value则为对应的变量;
  12. procedure  bind_variable(c  in   integer ,  name   in  varchar2, value):定义动态sql语句(DML)中所对应字段的值,c为游标, name 为字段名称,value为字段的值;
  13. 以上是在程序中经常使用到的几个函数及过程,其他函数及过程请参照oracle所提供定义语句dbmssql.sql
  14. (二)一般过程
  15. 对于一般的select 操作,如果使用动态的sql语句则需要进行以下几个步骤:
  16. open   cursor --->parse--->define column--->excute--->fetch rows--->close cursor;
  17. 而对于dml操作(insert , update )则需要进行以下几个步骤:
  18. open   cursor --->parse--->bind variable--->execute--->close cursor;
  19. 对于delete 操作只需要进行以下几个步骤:
  20. open   cursor --->parse--->execute--->close cursor;
  21. (三)实例应用
  22. 1. declare
  23. v_cid integer ;
  24. v_updatestr varchar2(100);
  25. v_rowupdated integer ;
  26. begin
  27. v_cid:=dbms_sql .open_cursor;
  28. v_updatestr:='update emp set comm=400 where empno=7499' ;
  29. dbms_sql .parse(v_cid,v_updatestr,dbms_sql .native);
  30. v_rowupdated:=dbms_sql .execute (v_cid);
  31. dbms_sql .close_cursor(v_cid);
  32. exception
  33. when  others  then
  34. dbms_sql .close_cursor(v_cid);
  35. raise;
  36. end ;
  37. 2.create   or   replace   function  updatecomm(p_comm emp.comm%type, p_empno emp.empno%type
  38. return   integer   as
  39. v_cid integer ;
  40. v_updatestr varchar2(100);
  41. v_rowupdated integer ;
  42. begin
  43. v_cid:=dbms_sql .open_cursor;
  44. v_updatestr:='update emp set comm=:comm where empno=:empno' ;
  45. dbms_sql .parse(v_cid,v_updatestr,dbms_sql .native);
  46. dbms_sql .bind_variable(v_cid,'comm' , 'p_comm' );
  47. dbms_sql .bind_variable(v_cid,'empno' , 'p_empno' );
  48. v_rowupdated:=dbms_sql .execute (v_cid);
  49. dbms_sql .close_cursor(v_cid);
  50. return  p_rowsupdated;
  51. exception
  52. when  others  then
  53. dbms_sql .close_cursor(v_cid);
  54. raise;
  55. end ;
  56. 调用--
  57. declare
  58. a integer ;
  59. begin
  60. a:=updatecomm(5000,a);
  61. dbms_output.put_line(a);
  62. end ;
  63. 3.create   or   replace   procedure  dynamiccopy(p_deptno1 emp.deptno%type  default   null ,p_deptno2 emp.deptno%type  default   null )
  64. as
  65. v_cid integer ;
  66. v_select varchar2(100);
  67. v_empno char (4);
  68. v_ename varchar2(10);
  69. v_deptno char (2);
  70. v_dummy integer ;
  71. begin
  72. v_cid:=dbms_sql .open_cursor;
  73. v_select:='select empno,ename,deptno from emp where deptno in(:d1,:d2)' ;
  74. dbms_sql .parse(v_cid,v_select,dbms_sql .native);
  75. dbms_sql .bind_variable(v_cid,'d1' ,p_deptno1);
  76. dbms_sql .bind_variable(v_cid,'d2' ,p_deptno2);
  77. dbms_sql .define_column(v_cid,1,v_empno,4);
  78. dbms_sql .define_column(v_cid,2,v_ename,10);
  79. dbms_sql .define_column(v_cid,3,v_deptno,2);
  80. v_dummy:=dbms_sql .execute (v_cid);
  81. loop
  82. if dbms_sql .fetch_rows(v_cid)=0 then
  83. exit;
  84. end  if;
  85. dbms_sql .column_value(v_cid,1,v_empno);
  86. dbms_sql .column_value(v_cid,2,v_ename);
  87. dbms_sql .column_value(v_cid,3,v_deptno);
  88. insert   into  emp1(empno,ename,deptno)  values (v_empno,v_ename,v_deptno);
  89. end  loop;
  90. dbms_sql .close_cursor(v_cid);
  91. commit ;
  92. exception
  93. when  others  then
  94. dbms_sql .close_cursor(v_cid);
  95. raise;
  96. end ;
  97. 4.DDL语句:DDL中联编变量是非法的,即使在解析后不能够调用bind_variable过程。另外,DDL解析后立即执行,不需要调用EXECUTE 过程,即使调用了也没有用。
  98. create   or   replace   procedure  recreatetable(p_table  in  varchar2,p_description  in  varchar2)
  99. as
  100. v_cursor number;
  101. v_createstring varchar2(100);
  102. v_dropstring varchar2(100);
  103. begin
  104. v_cursor:=dbms_sql .open_cursor;
  105. v_dropstring:='drop table' ||p_table;
  106. begin
  107. dbms_sql .parse(v_cursor,v_dropstring,dbms_sql .v7);
  108. exception
  109. when  others  then
  110. if sqlcode!=-942 then
  111. raise;
  112. end  if;
  113. end ;
  114. v_createstring:='create table' ||p_table||p_description;
  115. dbms_sql .parse(v_cursor,v_createstring,dbms_sql .native);
  116. dbms_sql .close_cursor(v_cursor);
  117. exception
  118. when  others  then
  119. dbms_sql .close_cursor(v_cursor);
  120. raise;
  121. end ;

DBMS_SQL系统包的使用相关推荐

  1. oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包

    认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命 ...

  2. android 环境配置和安装, Android系统包说明,基本控件,常用代码,ADB 命令行,APK文件确解,小技艺,...

    一.             环境配置和安装(Android2.2) 参考文章:这里 1.1     JDK 1.2     SDK 下载地址:http://dl.google.com/android ...

  3. 小米手机第三方卡刷软件_小米Max卡刷教程_小米Max用recovery刷第三方系统包

    来说一下有关小米Max手机的卡刷教程了,也就是用第三方recovery进行刷机的教程了,关于这个手机的第三方recovery之前已经给大家说过了,今天主要是说说如何利用recovery进行卡刷的操作, ...

  4. oppoa57升级android版本,OPPO A57刷机教程_OPPO A57升级更新官方系统包

    下面整理一下咱们的OPPO A57手机的刷机教程了,这个刷机教程也是针对官方的rom包的,之前有机友下载了官方的rom包,可是又不知道如何的操作,所以在这里整理了一个详细的卡刷刷机的教程供大家参考了, ...

  5. 联想z5可以刷鸿蒙系统吗,联想Z5线刷刷机教程_联想Z5线刷升级更新官方系统包方法...

    之前给大家说了说咱们的这个联想Z5手机的相关刷机包的下载,也就是原版的固件rom包的下载了,也有部分机友下载了,可是有的机友把固件包下载下来之后不知道如何使用,也不知道如何进行具体的刷机操作,所以在这 ...

  6. MacBook装低版本系统需要的系统包

    MacBook装低版本系统需要的系统包! 前因后果: 老MBP装了Catalina后偶尔有点卡.吃资源厉害,就想降回Sierra. 搜了一天国内网站.发现dmg包很少.而且都是网盘下载(百度云盘居多) ...

  7. maters保时捷啥时候升级鸿蒙,华为Mate RS保时捷版刷机教程_MateRS强刷升级更新官方系统包...

    之前给大家说过了这个华为Mate RS保时捷版手机的官方出厂rom包了,也就是固件系统包,今天就来说说这这个固件包如何进行刷入操作了,对于官方的固件包大家多多少少都了解过了,其实就是强刷包了,这个官方 ...

  8. 荣耀note8升级Android8,华为荣耀NOTE8官方rom固件刷机包_荣耀note8原版系统包_升级包...

    下面说一下咱们的华为荣耀NOTE8手机的官方rom包,之前也是很多机友在论坛里不停的找,可是找到的都是第三方的刷机包,最近是刚看到官方rom包出来,所以在这里整理了一下方便大家下载了,在这里说的官方的 ...

  9. 华为荣耀8X刷鸿蒙系统固件包,华为荣耀8X刷机教程_华为荣耀8X三键强刷官方系统包...

    同样也来说说这个华为荣耀8X手机的相关的固件rom包的刷机教程了,这个刷机也是强刷刷机了,这个强刷主要就是针对官方的固件rom包来进行的,之前也是有机友说自己想给手机进行降级操作,可是找不到相关的固件 ...

最新文章

  1. 还原dede数据后系统基本参数空白无显示的解决方法
  2. python 列表list
  3. 约瑟夫环java链表_java使用链表实现约瑟夫环
  4. **[权限控制] 利用CI钩子实现权限认证
  5. 8.8 正睿暑期集训营 Day5
  6. 工业交换机出现故障问题排查步骤详解
  7. 【JAVA基础篇】IO流
  8. IoC反转控制初步认识
  9. 使用剪切板[4]: 如果把子控件一起复制? - 同时回复 ghd2004 的问题
  10. eclipse中安装Tomcat
  11. 软件设计模式期末大作业——可乐商城管理系统
  12. 常见搜索引擎蜘蛛大全
  13. python官网学习爬虫资料_Python爬虫学习?
  14. 计算机系统崩溃了怎么办,电脑系统崩溃开不了机怎么办
  15. java.lang.NoClassDefFoundError: Could not initialize class找不类的问题
  16. ubuntu 22.04 系统下载
  17. 鸿蒙系统休眠时间,关闭系统休眠功能利弊
  18. 关于css命名规范一些小技巧或经验
  19. 游戏模型师已经饱和了吗?3d游戏建模师前景怎么样
  20. 华为云服务器不显示盘符,磁盘不显示盘符

热门文章

  1. zabbix入门到精通之--zabbix proxy配置(二)
  2. [AWDwR4] Iteration F4
  3. dll窗体的创建与调用
  4. ossim-agent代理和要监控的服务器的配置
  5. 微信小程序 提交表单
  6. mongodb 查询 mysql_MongoDB 基本查询使用
  7. document的window对象
  8. 有关T-SQL的10个好习惯
  9. 如何探测浏览器是否开启js功能
  10. 使用FastCoder写缓存单例