在oracle中动态游标的概念一般不常用,但有时根据客户的特殊业务,需要使用到动态游标来解决问题!在对于一条动态SQL语句而产生多条记录时,动态游标的使用将是一个很好的选择,具体参见如下在工作流项目中所应用到的用例:

CREATE OR REPLACE PROCEDURE PRO_WF_IMPORT_FROMCTAIS
AS
LV_INSID VARCHAR2(20);
LV_IDEAID VARCHAR2(20);
LV_CREATOR VARCHAR2(20);
LV_OID VARCHAR2(20);
LV_BTID VARCHAR2(20);
LV_PAYER VARCHAR(20);
LI_RECORDCOUNT NUMBER;
LV_MESSAGE VARCHAR2(20);
LV_SQL VARCHAR2(4000);
LV_SQLSTATEMENT VARCHAR2(4000);--动态SQL
LV_EXIST NUMBER;
LI_SRCURSOR INTEGER := DBMS_SQL.OPEN_CURSOR;--定义动态游标
LI_SRNORE INTEGER;--动态sql语句执行返回
LI_DBLINK VARCHAR2(20); CURSOR IMPORTWORKFLOW IS
SELECT ID, SQLSTATEMENT, REPEATE
FROM T_WF_ENG_INS_FROMCTAIS
WHERE EXECUTE = ''; ERR_GET_IDEAID EXCEPTION;
ERR_GET_FROMCTAIS_INFO EXCEPTION;
BEGIN FOR V_IMPORTRECORD IN IMPORTWORKFLOW LOOP
INSERT INTO T_WF_ENG_IMPORT_LOG(ID, SQLSTATEMENT, WFID, EXECUTETIME)
VALUES(S_IMPROT_LOG.NEXTVAL, V_IMPORTRECORD.SQLSTATEMENT, V_IMPORTRECORD.ID, SYSDATE);
COMMIT; LV_SQL := 'SELECT UPPER(SQLSTATEMENT) FROM T_WF_ENG_INS_FROMCTAIS '||
' WHERE EXECUTE = ''''' || ' AND ID=''' || V_IMPORTRECORD.ID ||'''';
EXECUTE IMMEDIATE LV_SQL INTO LV_SQLSTATEMENT;;--得到动态SQL语句.
SELECT DB_LINK INTO LI_DBLINK FROM USER_DB_LINKS;
LV_SQLSTATEMENT := REPLACE(LV_SQLSTATEMENT,' WHERE','@'||LI_DBLINK||' WHERE');--替换成dblink方式.得到最终的动态SQL语句.
LV_SQL := SUBSTR(LV_SQLSTATEMENT,INSTR(LV_SQLSTATEMENT,'FROM',1),LENGTH(LV_SQLSTATEMENT));
LV_SQL := REPLACE(LV_SQL,'FROM','SELECT COUNT(*) FROM');--用于判断此动态语句是否有记录.
EXECUTE IMMEDIATE LV_SQL INTO LV_EXIST;
IF LV_EXIST <>0 THEN --使用动态游标的开始
DBMS_SQL.parse(LI_SRCURSOR,LV_SQLSTATEMENT,DBMS_SQL.native);
DBMS_SQL.define_column(LI_SRCURSOR,1,LV_CREATOR,20);
DBMS_SQL.define_column(LI_SRCURSOR,2,LV_OID,20);
DBMS_SQL.define_column(LI_SRCURSOR,3,LV_BTID,20);
DBMS_SQL.define_column(LI_SRCURSOR,4,LV_PAYER,20);
LI_SRNORE := DBMS_SQL.execute(LI_SRCURSOR); LOOP
IF DBMS_SQL.FETCH_ROWS(LI_SRCURSOR) = 0 THEN
EXIT;
ELSE
DBMS_SQL.COLUMN_VALUE(LI_SRCURSOR, 1, LV_CREATOR);
DBMS_SQL.COLUMN_VALUE(LI_SRCURSOR, 2, LV_OID);
DBMS_SQL.COLUMN_VALUE(LI_SRCURSOR, 3, LV_BTID);
DBMS_SQL.COLUMN_VALUE(LI_SRCURSOR, 4, LV_PAYER);
END IF;
---动态游标的结束(以end loop结束) IF LV_CREATOR IS NULL OR LV_OID IS NULL OR LV_BTID IS NULL OR LV_PAYER IS NULL THEN
RAISE ERR_GET_FROMCTAIS_INFO;
END IF; IF V_IMPORTRECORD.REPEATE = '' THEN
SELECT COUNT(B.INSID) INTO LI_RECORDCOUNT
FROM T_WF_ENG_INS_HSTY A, T_TAX_PRIVATE B
WHERE A.CLASSID = V_IMPORTRECORD.ID AND A.ID = B.INSID AND B.PAYER = LV_PAYER;
IF LI_RECORDCOUNT > 0 THEN
return;
END IF;
END IF; LV_INSID := FUN_WF_GET_MAX_INSID(LV_BTID);
PRO_SYS_GET_MAXID('T_WF_ENG_IDEA_HSTY',LV_IDEAID, LV_MESSAGE); IF LENGTH(LV_MESSAGE) > 0 THEN
RAISE ERR_GET_IDEAID;
END IF; SELECT COUNT(ID) INTO LV_EXIST FROM T_WF_ENG_INS_HSTY WHERE ID = LV_INSID;
IF LV_EXIST=0 THEN
SELECT COUNT(MINSID) INTO LV_EXIST FROM T_WF_ENG_IDEA_HSTY WHERE MINSID = LV_INSID;
IF LV_EXIST=0 THEN
SELECT COUNT(INSID) INTO LV_EXIST FROM T_TAX_PRIVATE WHERE INSID = LV_INSID;
IF LV_EXIST=0 THEN
INSERT INTO T_WF_ENG_INS_HSTY(ID, CLASSID, CREATOR, OID, BTID, SDAY, EDAY, STATUS)
VALUES(LV_INSID, V_IMPORTRECORD.ID, LV_CREATOR, LV_OID, LV_BTID, SYSDATE, SYSDATE, 'C'); INSERT INTO T_WF_ENG_IDEA_HSTY(ID, MINSID, MACT, USERID, STARTTIME, ENDTIME)
VALUES(LV_IDEAID, LV_INSID, '', LV_CREATOR, SYSDATE, SYSDATE); INSERT INTO T_TAX_PRIVATE(INSID, PAYER) VALUES(LV_INSID, LV_PAYER);
COMMIT;
END IF;
END IF;
END IF;
END LOOP;
END IF;
END LOOP;
COMMIT;
DBMS_SQL.CLOSE_CURSOR(LI_SRCURSOR);--最后关闭动态游标. EXCEPTION WHEN ERR_GET_IDEAID THEN
RAISE_APPLICATION_ERROR (-20001,LV_MESSAGE);
WHEN ERR_GET_FROMCTAIS_INFO THEN
RAISE_APPLICATION_ERROR (-20002,'对不起其它条件有为空的值!');
END PRO_WF_IMPORT_FROMCTAIS;

orcle中如何使用动态游标来对变量进行赋值的更多相关文章

  1. main方法中声明8种基本数据类型的变量并赋值

    main方法中声明8种基本数据类型的变量并赋值  char→  int→ long→ float→ double byte→ short→ 

  2. 12.编写一个Java项目,定义包,在包下定义包含main方法的类,在main方法中声明8种基本数据类型的变量并赋值,练习数据类型转换。

    注意:float虽然是4个自减,但是它的取值范围却比8个字节的long要大. float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal, ...

  3. 编写一个Java项目,定义包,在包下定义包含main方法的类,在main方法中声明8种基本数据类型的变量并赋值,练习数据类型转换。

  4. 在PL/SQL中使用游标、动态sql和绑定变量的小例子

    需求:查询并输出30号部门的雇员信息 方式一:使用 loop...fetch SET serveroutput ON; DECLARE CURSOR c_emp IS ; v_emp emp%rowt ...

  5. 动态游标(例如表名作为参数)以及动态SQL分析

    表名作为参数的动态游标 DECLARE v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP'; --l_rec SYS_REFCURSOR; T ...

  6. 【Oracle】PL/SQL 显式游标、隐式游标、动态游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,Oracle会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

  7. 动态游标(比如表名作为參数)以及动态SQL分析

    表名作为參数的动态游标 DECLARE v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP'; --l_rec SYS_REFCURSOR; T ...

  8. IE7中使用Jquery动态操作name问题

    问题:IE7中无法使用Jquery动态操作页面元素的name属性. 在项目中有出现问题,某些客户的机器偶尔会有,后台取不到前台的数据值. 然开发和测试环境总是不能重现问题.坑爹之处就在于此,不能重现就 ...

  9. Hadoop学习笔记—13.分布式集群中节点的动态添加与下架

    开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...

随机推荐

  1. mysql数据库中,查看某个数据库下的表的存储类型都有哪些

    需求描述: 在备份数据库的时候,使用mysqldump进行数据库的备份,如果库中仅仅有innodb存储引擎, 那么使用--single-transaction就可以,如果还有其他的存储引擎类型就要使用 ...

  2. C语言中do...while(0)的妙用-避免goto

    使用goto的优雅并避免结构的混乱 将要跳转到的语句用do{-}while(0) 包起来就可以. reference #defien N 10 bool Execute() { // 分配资源 int ...

  3. Mysql课后思考题

    1.请简述数据库.表和数据库服务器之间的关系? 知识点数据库存储结构 一个数据库服务器可以管理多个数据库,通常情况下开发人员会针对每个应用创建一个数据库,为保存应用中实体的数据,会在数据库中创建多个表 ...

  4. PHP-002

    PHP URL重写 怎样在IIS环境下配置Rewrite规则_百度经验 http://jingyan.baidu.com/article/c33e3f485a7c74ea15cbb50e.html W ...

  5. 泛型的几种类型以及初识winform

    今天学习的可以分为两类吧,但是学习的都是比较抽象的,不太容易掌握吧.首先我们大部分时间学习了泛型,泛型的委托,泛型接口以及枚举器,迭代器,扩展方法:最后简单的认识了webform,实现了一个简单的功能 ...

  6. oracle数据库sql比较日期

    select * from cc_random_check_info t where check_time > to_date('2016-09-09','yyyy-MM--dd')

  7. HTML5怎么实现录音和播放功能

    小旋风柴进 html: [html] view plain copy <span style="white-space:pre"> </span><a ...

  8. 【VUE】Mac下vue 开发环境搭建,以及目录结构

    1 安装Node.js 参看 node.js环境安装   http://www.cnblogs.com/richerdyoung/p/7265786.html 2 安装淘宝镜像 npm install ...

  9. Synergy 多系统共享鼠标键盘 Windows 和 Mac 完全配置教程

    公司终于配上了双主机双系统双屏幕,编码是爽了,但是桌上的键盘有多了一套,有没有什么软件能够在不同的电脑之间共享键盘和鼠标呢?后来发下了Synergy这款软件.不仅免费而且开源(支持下). 让办公桌上的 ...

  10. JS-鼠标彩色拖尾小效果

    实现步骤解析: * 这原本就是一个鼠标后面跟随一串小方块的效果,     * 后来我就想,运用之前学的随机数的案例把小方块的颜色做成彩色的,     * 并且每一个小方块的色彩是随机分配而不是我自己手 ...