作者:雪影飘枫2502928577 | 来源:互联网 | 2023-05-18 19:25
存储过程利用游标里执行插入表,报异常,我想即使报异常也让他继续执行,把不报异常的插入进去。本想用sql执行的,无奈报错只好用游标把值硬插入,算是笨方法了。CREATEORREPLA
存储过程利用游标里执行插入表,报异常,我想即使报异常也让他继续执行,把不报异常的插入进去。
本想用sql执行的,无奈报错只好用游标把值硬插入,算是笨方法了。
CREATE OR REPLACE PROCEDURE testcursor
is
yhjerror EXCEPTION;
myresult INT;
BEGIN
declare
--类型定义
cursor c_job
is
SELECT COM_ID,
BAR_CODE,
ITEM_CODE,
COLOR_CODE,
SIZEID,
SUPBAR_CODE,
ORI_BARCODE,
GB_BARCODE,
OTHER_BARCODE
FROM YHJ_BARCODES;
--定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型
c_row c_job%rowtype;
begin
for c_row in c_job
loop
INSERT
INTO BARCODES
(
COM_ID,
BAR_CODE,
ITEM_CODE,
COLOR_CODE,
SIZEID,
SUPBAR_CODE,
ORI_BARCODE,
GB_BARCODE,
OTHER_BARCODE
)
VALUES
(
c_row.COM_ID,
c_row.BAR_CODE,
c_row.ITEM_CODE,
c_row.COLOR_CODE,
c_row.SIZEID,
c_row.SUPBAR_CODE,
c_row.ORI_BARCODE,
c_row.GB_BARCODE,
c_row.OTHER_BARCODE
)
;
myresult:=SQL%ROWCOUNT;
IF ((myresult<>1) OR (myresult=0)) THEN
BEGIN
RAISE yhjerror;
end;
END IF ;
end loop;
end;
EXCEPTION
WHEN yhjerror THEN
BEGIN
null;
END;
END testcursor;
--COM_ID, BAR_CODE, ITEM_CODE, COLOR_CODE, SIZEID, SUPBAR_CODE, ORI_BARCODE, GB_BARCODE, OTHER_BARCODE
5 个解决方案
在loop里面定义异常,捕获到异常以后使用go to 继续下次循环,我没试过,不过应该可行,你可以试一下
把begin exception end写在loop里面,形如
for x in (...) loop
begin
insert into .........;
exception
when others then
dbms_output.put_line(sqlerrm);
end;
end loop;
就可以了
begin
exception
end
是比较常用的方法。 建议 LZ 多多考虑一下业务。