表名作为参数的动态游标

DECLAREv_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP';--l_rec        SYS_REFCURSOR;TYPE t_data IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;TYPE t_cur IS REF CURSOR;l_data       t_data;l_rec        t_cur;l_cur        VARCHAR2(4000);v_fm_barcode VARCHAR2(30) := 'cxy-p-001';v_to_barcode VARCHAR2(30) := 'cxy-p-002';v_barcode    VARCHAR2(30);
BEGINl_cur := 'select barcode from ' || v_table_name || ' where barcode >= ' ||''''||v_fm_barcode||'''' || ' and barcode <= ' ||''''||v_to_barcode || '''';dbms_output.put_line(l_cur);OPEN l_rec FOR l_cur;LOOPEXIT WHEN l_rec%NOTFOUND;FETCH l_rec BULK COLLECTINTO l_data;FOR i IN 1 .. l_data.count LOOPdbms_output.put_line(l_data(i));END LOOP;END LOOP;
END;

动态SQL

/*1.什么是动态SQL?动态SQL是指在运行PL/SQL块时动态输入SQL语句。在PL/SQL块中只能执行DDL(create、alter、drop)、DCL(grant、revoke)或比较灵活的SQL语句(如select子句不带where条件);动态SQL的性能不如静态SQL,但是比较灵活;在PL/SQL块中编写动态SQL语句时需要将SQL语句存放到字符串变量中而且SQL语句可以包含占位符(以冒号开始);2.动态SQL的语法2.1 使用execute immediate语句可以处理多数动态SQL操作如:DDL语句(create、alter、drop)、DML语句(insert、update、delete)、DCL(grant、revoke)以及单行的select子句;但是不能处理多行查询语句。2.2 使用open...for,fetch和close语句在游标中使用。2.3 使用批量动态SQL语句*/---------------------------------------------------------------***************************************************************1. 使用execute immediate---------------------------------------------------------------1.1 使用execute immediate处理DDL语句-----------------------------------------------------------------案例01:使用execute immediate处理DDL语句--createdeclarecreate_table  varchar2(200);begincreate_table:='create table ' ||'&table_name' ||'(sid int, sno int)';execute  immediate create_table  ;end;--案例02:使用execute immediate处理DDL语句---alterdeclarealter_table  varchar2(200);beginalter_table:='alter table &target_table_name modify &column_name varchar2(10)';execute  immediate alter_table  ;end;--案例03:使用execute immediate处理DDL语句---dropdeclaredrop_table  varchar2(200);begindrop_table:='drop table ' ||'&target_table_name';execute  immediate drop_table  ;end;--案例04:使用execute immediate处理DDL语句--drop tablecreate or replace procedure drop_table (table_name varchar2)is
sql_sta varchar2(200);beginsql_sta:='drop table ' ||table_name;execute immediate sql_sta;end;--调用方法:exec drop_table('accp');--案例05:使用execute immediate处理DDL语句--create+selectdeclareselect_sta varchar2(200);emp_rec emp%rowtype;beginexecute immediate'create table sodi(sid int, sno int)';select_sta:='select * from emp where empno=:id';execute  immediate select_sta  into emp_rec using &1;   /*使用占位符时,这个占位符是在引号内使用的*/end;---------------------------------------------------------1.2 使用execute immediate处理DCL语句------------------------------------------------------------案例01:使用execute immediate处理DCL语句--grantcreate or replace procedure grant_priv(priv varchar2, username varchar2)ispriv_stat varchar2(200);beginpriv_stat:=' grant '|| priv || ' to ' || username; --注意字符串和连接符之间的空格execute immediate priv_stat;end;--调用方法exec grant_priv('create session', 'scott');--案例02:使用execute immediate处理DCL语句--revokecreate or replace procedure revoke_priv(priv varchar2, username varchar2)ispriv_stat varchar2(200);beginpriv_stat:=' revoke '|| priv || ' from ' || username; --注意字符串和连接符之间的空格execute immediate priv_stat;end;--调用方法exec revoke_priv('create session', 'scott');----------------------------------------------------------------1.3.使用execute immediate处理DML语句----------------------------------------------------------------1.处理无占位符和return子句的DML语句--案例01:查询子句:selectdeclaresql_stat varchar2(100);beginsql_stat:='select * from emp';execute immediate sql_stat;end;--案例02:处理无占位符和return子句的DML语句--insertdeclareinsert_table varchar2(200);begininsert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;end;--案例03:处理无占位符和return子句的DML语句--updatedeclareupdate_table varchar2(200);beginupdate_table:='update &table_name set &column_name=&new_value ';execute immediate update_table;end;--案例06:处理无占位符和return子句的DML语句--deletedeclaredelete_table varchar2(200);begindelete_table:='delete from  &table_name  ';execute immediate delete_table;end;--案例05:新建一个表然后插入数据--create+insertdeclarecreate_table  varchar2(200);begincreate_table:='create table &table_name(sid int, sno int)';execute  immediate create_table  ;end;declareinsert_table varchar2(200);begininsert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;end;--案例06:同时实现新建一个表并插入数据--create+insertdeclarecreate_table  varchar2(200);insert_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute  immediate create_table  ;insert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;end;--案例07:同时实现新建一个表并插入数据--create+insert+update/*这里也可以分开写*/declarecreate_table  varchar2(200);insert_table varchar2(200);update_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute  immediate create_table  ;insert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;update_table:='update &table_name set &column_name=&new_value where sid=&old_value';execute immediate update_table;end;--案例08:同时实现新建一个表并插入数据--create+insert+update+deletedeclarecreate_table  varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute  immediate create_table  ;insert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;update_table:='update &table_name set &column_name=&new_value where sid=&old_value';execute immediate update_table;delete_table:='delete from &delete_tablename';execute immediate delete_table;end;--案例08:同时实现新建一个表并插入数据--create+insert+update+delete+insertdeclarecreate_table  varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);re_insert_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute  immediate create_table  ;insert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;update_table:='update &table_name set &column_name=&new_value where sid=&old_value';execute immediate update_table;delete_table:='delete from &delete_tablename';execute immediate delete_table;re_insert_table:='insert into &re_table_name values (&new_sid, &new_sno)';execute immediate re_insert_table;end;2.处理占位符的DML语句--案例01:处理占位符的DML语句:create+insertdeclarecreate_table  varchar2(200);insert_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute  immediate create_table  ;insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using  &2,&3;end;--案例02:处理占位符的DML语句:create+insert_updatedeclarecreate_table  varchar2(200);insert_table varchar2(200);update_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute  immediate create_table  ;insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using  &1,&2;update_table:='update &update_tablename set &update_column_name=:new_value where &condition_column=:old_value ';execute immediate update_table using &3 ,&4;end;---ordeclarecreate_table  varchar2(200);insert_table varchar2(200);update_table varchar2(200);begincreate_table:='create table &新建的表名 (sid int, sno int)';execute  immediate create_table  ;insert_table:='insert into &插入数据的表名 values (:sid, :sno)';execute immediate insert_table using  &sid的值 ,&sno的值;update_table:='update &被更新的表名 set &更新的列名=:new_value where &条件列=:old_value ';execute immediate update_table using &新值 ,&条件列的值;end;--案例03:处理占位符的DML语句:create+update+insert+deletedeclarecreate_table  varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute  immediate create_table  ;insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using  &1,&2;update_table:='update &update_tablename set &update_column_name=:new_value where &update_condition_column=:delete_condition_column_value ';execute immediate update_table using &3 ,&4;delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value';execute immediate delete_table using &5;end;---执行过程:SQL> declare2  create_table  varchar2(200);3  insert_table varchar2(200);4  update_table varchar2(200);5  delete_table varchar2(200);6  begin7  create_table:='create table &table_name (sid int, sno int)';8  execute  immediate create_table  ;910  insert_table:='insert into &target_table_name values (:sid, :sno)';11  execute immediate insert_table using  &1,&2;1213  update_table:='update &update_tablename set &update_column_name=:new_valuewhere &update_condition_column=:delete_condition_column_value ';14  execute immediate update_table using &3 ,&4;1516  delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value';17  execute immediate delete_table using &5;18  end;19  /输入 table_name 的值:  sz原值    7: create_table:='create table &table_name (sid int, sno int)';新值    7: create_table:='create table sz (sid int, sno int)';输入 target_table_name 的值:  sz原值   10: insert_table:='insert into &target_table_name values (:sid, :sno)';新值   10: insert_table:='insert into sz values (:sid, :sno)';输入 1 的值:  101输入 2 的值:  201原值   11: execute immediate insert_table using  &1,&2;新值   11: execute immediate insert_table using  101,201;输入 update_tablename 的值:  sz输入 update_column_name 的值:  sid输入 update_condition_column 的值:  sno原值   13: update_table:='update &update_tablename set &update_column_name=:new_value where &update_condition_column=:delete_condition_column_value ';新值   13: update_table:='update sz set sid=:new_value where sno=:delete_condition_column_value ';输入 3 的值:  1001输入 4 的值:  201原值   14: execute immediate update_table using &3 ,&4;新值   14: execute immediate update_table using 1001 ,201;输入 dele_table_name 的值:  sz输入 delete_condition_column 的值:  sno原值   16: delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value';新值   16: delete_table:='delete from sz where sno=:delete_condition_column_value';输入 5 的值:  201原值   17: execute immediate delete_table using &5;新值   17: execute immediate delete_table using 201;PL/SQL 过程已成功完成。SQL> select * from sz;未选定行3.处理包含returning子句的DML语句--案例01:处理包含returning子句的DML语句--create+insert+updatedeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);res varchar2(100);begincreate_table:='create table &new_table_name (sid int, sno int)';execute immediate create_table;insert_table:='insert into &insert_target_table_name values (:sid, :sno)';execute immediate insert_table using &1,&2 ;update_table:='update &update_target_table_name set &udpate_column_name=:new_value where &condition_column_name=:old_value  returning &returning_name into :res';execute immediate update_table using &3,&4returning into res;dbms_output.put_line('the result is : ' ||res);end;

转载于:https://www.cnblogs.com/wanghang/p/6299279.html

动态游标(例如表名作为参数)以及动态SQL分析相关推荐

  1. sql 使用存储过程传递列名或表名作为参数

    在使用存储过程时,若动态的传递表名或者是列名时,可以考虑使用动态sql.代码如下; alter procedure Proc_UpdateDatetimeCounter @businessNum nv ...

  2. mysql function 表名作为参数_mysql 常用的分组聚合函数

    mysql 常用的分组聚合函数 1.聚合运算 一般情况下,需要的聚合数据(和,平均值,最大,最小等)并不总是存储在表中,但是可以执行存储数据的计算来获取它. 根据定义,聚合函数对一组值执行计算并返回单 ...

  3. 创建表名作为参数的mysq存储过程【procedure】

    简述 看到下文受到启发,解决了这个问题 https://blog.csdn.net/hengbao4/article/details/78084008 代码 mysql> delimiter / ...

  4. 根据excel列动态创建mysql表_根据数据库字段动态生成excel模版下载,上传模版获取数据存入数据库(poi 反射)...

    环境:mysql5.7.28 java8 Spring boot 2.2.4 mybatis-plus3.10 动态:根据需求,用户可以选择对应的字段生成excle模版 下载 poi 反射:poi是e ...

  5. mysqldump备份数据不锁表的加参数方法及原理分析

    mysqldump命令的备份用法分析-锁表不锁表 mysqldump默认的字符集是utf8 /etc/my.cnf添加如下两行文件,重启mysql服务,以输出日志方便分析general_log=on ...

  6. Mysql中表名作为参数的问题

    近期由于程序的异常,导致数据库中创建了大量的表(约4000个),纠结的是表中的数据还都是有用的. 需要合并到一个表中,首先想到的就是使用存储过程来处理,但由于表名都是动态生成的,需要解决在存储过程中处 ...

  7. db2存储过程 可以使用游标循环嵌套吗_DB2存储过程使用动态游标的例子

    本文将为您介绍一个 DB2 存储过程使用动态游标的例子,如果您对动态游标的使用感 兴趣的话,不妨一看,对您学习 DB2 的使用会有所帮助. CREATE PROCEDURE data_wtptest( ...

  8. php动态数组的存储过程,存储过程(数组参数、for循环、拼凑的动态sql游标、merge into)...

    create or replace procedure SFGL_XF_ONE_ADD(p_njdm in varchar2, p_yxdm in varchar2, p_zydm in varcha ...

  9. Oracle中动态拼接参数怎么传,急oracle 动态游标传日期参数是如何传的呢,请赐教,多谢...

    当前位置:我的异常网» Oracle开发 » 急oracle 动态游标传日期参数是如何传的呢,请赐教 急oracle 动态游标传日期参数是如何传的呢,请赐教,多谢 www.myexceptions.n ...

最新文章

  1. P1051 谁拿了最多奖学金
  2. 在Linux系统安装Nodejs 最简单步骤
  3. Drupal 7中 page.tpl.php 的可用变量
  4. python如何引发和处理异常_在python3.6中,如何捕捉异常并引发异常以便稍后处理?...
  5. java的静态如何理解_java中的静态是什么?如何理解?
  6. C语言数组旋转问题(C笔记)
  7. dlna和miracast可以共存吗_解决播放网络视频卡顿及DLNA和Miracast容易掉线的方法
  8. 数据分析5大软件大PK:Python、Excel、R、SAS、SPSS你最爱哪个?
  9. matlab中pwm占空比计算代码,详解STM32的PWM输出及频率和脉宽(占空比)的计算
  10. ggplot2的中文显示
  11. 权重衰减(weight decay)与学习率衰减(learning rate decay)
  12. PowerDesigner清理注册表
  13. 获取 公众号 二维码 的方法
  14. 计算机网络英文习题(中文及答案解析)
  15. c语言bit作用,c语言中bit的用法
  16. 《正本清源区块链》课程分享裂变运营复盘
  17. 数字化引领LED照明的未来
  18. html跳转qq浏览器,javascript,_银联在线支付接口,qq浏览器不能跳转,javascript - phpStudy...
  19. 【Matlab路径规划】蚁群算法机器人大规模栅格地图最短路径规划【含源码 1860期】
  20. arm linux 移植过程——uboot makefile注释

热门文章

  1. 黑猿大叔-译文 | TensorFlow实现Batch Normalization
  2. linux镜像包含数据库数据么,docker 镜像中包含数据库环境和运行环境
  3. android java 指针异常处理,Android自定义抛出异常的方法详解
  4. python中exchange函数使用_python基于exchange函数发送邮件过程详解
  5. mysql 如何按时间备份_如何定时备份mysql数据库
  6. python的os模块使用_Python之os模块的常见用法
  7. java 2个小数点_在java程序中取后面两个小数点的方法
  8. nmap扫描常用命令详解
  9. Eclipse之java虚拟机初始化失败问题已解决
  10. ES6-set集合应用