orcle中如何使用动态游标来对变量进行赋值
在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中如何使用动态游标来对变量进行赋值的更多相关文章
- main方法中声明8种基本数据类型的变量并赋值
main方法中声明8种基本数据类型的变量并赋值 char→ int→ long→ float→ double byte→ short→
- 12.编写一个Java项目,定义包,在包下定义包含main方法的类,在main方法中声明8种基本数据类型的变量并赋值,练习数据类型转换。
注意:float虽然是4个自减,但是它的取值范围却比8个字节的long要大. float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal, ...
- 编写一个Java项目,定义包,在包下定义包含main方法的类,在main方法中声明8种基本数据类型的变量并赋值,练习数据类型转换。
- 在PL/SQL中使用游标、动态sql和绑定变量的小例子
需求:查询并输出30号部门的雇员信息 方式一:使用 loop...fetch SET serveroutput ON; DECLARE CURSOR c_emp IS ; v_emp emp%rowt ...
- 动态游标(例如表名作为参数)以及动态SQL分析
表名作为参数的动态游标 DECLARE v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP'; --l_rec SYS_REFCURSOR; T ...
- 【Oracle】PL/SQL 显式游标、隐式游标、动态游标
在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,Oracle会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...
- 动态游标(比如表名作为參数)以及动态SQL分析
表名作为參数的动态游标 DECLARE v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP'; --l_rec SYS_REFCURSOR; T ...
- IE7中使用Jquery动态操作name问题
问题:IE7中无法使用Jquery动态操作页面元素的name属性. 在项目中有出现问题,某些客户的机器偶尔会有,后台取不到前台的数据值. 然开发和测试环境总是不能重现问题.坑爹之处就在于此,不能重现就 ...
- Hadoop学习笔记—13.分布式集群中节点的动态添加与下架
开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...
随机推荐
- tomcat server.xml docbase workdir
在tomcat安装好后,只要把你的web项目copy到%TOMCAT_HOME%webapp下面就可以是使用啦!!其实还有种方法就是设定虚拟目录,即把项目的目录映射到tomcat中.这样做即可以不用重 ...
- Loadrunner中socket协议中的三个关联函数
这3个函数其实都可以动态获取运行中收到的数据包中的数据,只要跟在要获取的收取数据包脚本后面即可.其中:lrs_save_searched_string和lrs_save_param如果buf_desc ...
- EasyUI 扩展自定义EasyUI校验规则 验证规则
$.extend($.fn.validatebox.defaults.rules, {CHS: {validator: function (value, param) {return /^[\u039 ...
- Unity5.5+easytouch5双摇杆控制角色移动
第一步:新建两个Joystick,分别改名LeftJoyStick和RightJoyStick 在LeftJoyStick的ETC Joystick-Axes properties中的Horizont ...
- ajax 同步
Ajax请求默认的都是异步的如果想同步 async设置为false就可以(默认是true) var html = $.ajax({ url: "some.php", async ...
- Cocos2d-x3.0触摸
cocos2d-x 3.0開始採用C++11,并開始脱离OC风格,在触摸处理上也作出了改变 C++11带来了Lambda表达式(匿名函数),它将简化程序编写,可使代码更清晰易懂 在旧2.x版本号的触摸 ...
- MySQL性能优化(三)-- 索引
一.什么是索引及索引的特点 索引是一种数据结构 索引的特点:查找速度快,排好序,数据结构 索引的数据结构类型有:BTREE索引和HASH索引,下面展示的是BTREE索引. BTREE:balance ...
- easyui 时间定格为 时分
$.fn.datetimebox.defaults.formatter = function (date) { console.log('dt formatting ' + date); if (!( ...
- ExtJS 6.2 基础使用
一. 安装: 下载两个压缩包:分别是 ext-6.2.0-gpl(这个是ExtJS 的SDK文件,创建新项目的时候需要用). SenchaCmd-6.5.2-windows-64bit (这个下载下来 ...
- <转>KMP算法详解
看了好久的KMP算法,都一直没有看明白,直到看到了这篇博客http://www.tuicool.com/articles/e2Qbyyf让我瞬间顿悟. 如果你看不懂 KMP 算法,那就看一看这篇文章 ...