热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracleinto循环,oracle游标中使用selectinto查询结果为NULL导致异常提前退出循环——菜鸟解决办法(^_^)...

首先贴出我的存储过程createorreplaceprocedurePROC_FILLANDREMOVECDEMAsV_ERRORNUMBER(10,0);--异常e_cardnb

首先贴出我的存储过程

create or replace procedure PROC_FILLANDREMOVECDEM As

V_ERROR NUMBER(10, 0); --异常

e_cardnbr varchar2(20); --卡号

e_filename varchar2(200); --文件名

e_contents clob; --内容

e_productno VARCHAR2(4); --产品编码

e_PAGENO VARCHAR2(4); --版面代码

e_CUSTR varchar2(20); --证件号码

e_STATUS VARCHAR2(5); --处理状态

e_CREATED_TIME DATE; --处理时间

CURSOR E_DATA IS

SELECT * FROM DATASTRIPCARDERR t where t.pageno is null;

begin

for err_data in E_DATA loop

BEGIN

--(select into多个变量时候如果查询的变量有一个为null则进入异常块,终止循环)

select t.cardnbr,

t.filename,

t.contents,

t.productno,

t.pageno,

t.custr,

t.status,

t.created_time

into e_cardnbr,

e_filename,

e_contents,

e_productno,

e_PAGENO,

e_CUSTR,

e_STATUS,

e_CREATED_TIME

from datastripcard t

where t.custr = err_data.custr

and t.productno = err_data.productno;

end;

end loop;

commit;

EXCEPTION

WHEN OTHERS THEN

V_ERROR := SQLCODE;

DBMS_OUTPUT.put_line(V_ERROR);

INSERT INTO s_syslog t

(t.log_id, t.type, t.contents, t.memo)

values

(s_syslog_seq.nextval,

'0008',

v_error,

'。。。。。');

COMMIT;

ROLLBACK;

end PROC_FILLANDREMOVECDEM;

更新后的存储过程:

添加的sql在  ——————————-块之间

create or replace procedure PROC_FILLANDREMOVECDEM As

V_ERROR NUMBER(10, 0); --异常

e_cardnbr varchar2(20); --卡号

e_filename varchar2(200); --文件名

e_contents clob; --内容

e_productno VARCHAR2(4); --产品编码

e_PAGENO VARCHAR2(4); --版面代码

e_CUSTR varchar2(20); --证件号码

e_STATUS VARCHAR2(5); --处理状态

e_CREATED_TIME DATE; --处理时间

e_count number;--注:控制变量

CURSOR E_DATA IS

SELECT * FROM DATASTRIPCARDERR t where t.pageno is null;

begin

for err_data in E_DATA loop

BEGIN

------------------------------------注:每次循环先根据条件看查询的数据是否有值

select count(1)

into e_count

from datastripcard t

where t.custr = err_data.custr

and t.productno = err_data.productno;

IF e_count > 0 THEN

-------------------------------------注:有值的话再赋给变量,这样就不会有异常

select t.cardnbr,

t.filename,

t.contents,

t.productno,

t.pageno,

t.custr,

t.status,

t.created_time

into e_cardnbr,

e_filename,

e_contents,

e_productno,

e_PAGENO,

e_CUSTR,

e_STATUS,

e_CREATED_TIME

from datastripcard t

where t.custr = err_data.custr

and t.productno = err_data.productno;

END IF;

end;

end loop;

commit;

EXCEPTION

WHEN OTHERS THEN

V_ERROR := SQLCODE;

DBMS_OUTPUT.put_line(V_ERROR);

INSERT INTO s_syslog t

(t.log_id, t.type, t.contents, t.memo)

values

(s_syslog_seq.nextval,

'0008',

v_error,

'。。。。。');

COMMIT;

ROLLBACK;

end PROC_FILLANDREMOVECDEM;

这是个笨方法,但是却最简单明了!

希望大神指教方法的不足之处。。。

点赞 (0)赏分享 (0)



推荐阅读
author-avatar
mobiledu2502890161
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有