orcle中如何使用动态游标来对变量进行赋值!
来源:互联网 发布:手机阿里云系统好用吗 编辑:程序博客网 时间:2024/05/16 01:06
在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 = '1';
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 = ''1''' || ' 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 = '0' 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, '1', 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中如何使用动态游标来对变量进行赋值!
- orcle 游标使用
- finally语句中对变量进行赋值的问题
- AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
- esql中声明变量和使用动态游标
- c++中如何通过函数参数对指针进行赋值
- c++中如何通过函数参数对指针进行赋值
- v5中使用动态宏和会话变量对数据权限进行控制
- shell中用$来引用变量的值,但对变量赋值的时候无需使用$符号
- 如何在游标for循环中使用动态SQL语句?
- orcle数据库游标(光标)的使用
- 插件中对动态表单数据模型进行赋值实现动态表单数据绑定
- 如何使用 Web API 来对 MVC 应用程序进行身份验证
- 如何在eclipse中对局部变量进行debug?
- 使用matlab如何根据循环变量对文件进行命名
- 游标概念作用以及orcle游标的使用
- 动态SQL中set与select对变量赋值的影响
- 游标变量、动态sql及变量绑定的使用
- 使用iReport制作报表的详细过程(Windows环境下)
- 使用Jasperreport作为报表控件开发胖客户端报表应用
- IEWebControls安装方法
- 当告别一段考试之后
- 一篇对H.323协议介绍比较详细的文章
- orcle中如何使用动态游标来对变量进行赋值!
- 娃娃贩卖机
- Eclipse使用技巧
- 堆(Heap)和栈(Stack)的区别?
- 堆溢出的研究
- PMP组件与技术研究剖析
- 获取文件列表
- 日期运算
- web打印datagrid的通用类