存储过程利用游标里执行插入表,报异常,我想即使报异常也让他继续执行,把不报异常的插入进去。

时间:2021-11-20 22:53:46
存储过程利用游标里执行插入表,报异常,我想即使报异常也让他继续执行,把不报异常的插入进去。

本想用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 个解决方案

#1


在loop里面定义异常,捕获到异常以后使用go to 继续下次循环,我没试过,不过应该可行,你可以试一下

#2


CREATE OR REPLACE PROCEDURE testcursor 
is 
    yhjerror EXCEPTION; 
    myresult INT; 
BEGIN 
    myresult:=1;
    declare loopresult INT;
    declare 
        --类型定义 
        cursor c_job 
    ...
            loopresult:=SQL%ROWCOUNT; 
            IF ((loopresult<>1) OR (loopresult=0)) THEN 
                BEGIN 
                    loopresult:=myresult; 
                end;   
            END IF ;  
        end loop; 
        IF ((myresult<>1) OR (myresult=0)) THEN 
            BEGIN 
                RAISE yhjerror; 
            end;   
        END IF ;  
    end; 
EXCEPTION 
...

#3


没理解。
错误是你自己抛出来的,既然不想中断循环,就不要在循环中抛错误啊。
CREATE OR REPLACE PROCEDURE testcursor 
is 
    yhjerror EXCEPTION; 
    myresult INT; 
BEGIN 
    myresult:=1;
    declare loopresult INT;
    declare 
        --类型定义 
        cursor c_job 
    ...
            loopresult:=SQL%ROWCOUNT; 
            IF ((loopresult<>1) OR (loopresult=0)) THEN 
                BEGIN 
                    myresult:=loopresult; 
                end;   
            END IF ;  
        end loop; 
        IF ((myresult<>1) OR (myresult=0)) THEN 
            BEGIN 
                RAISE yhjerror; 
            end;   
        END IF ;  
    end; 
EXCEPTION 
...

#4


把begin exception end写在loop里面,形如

for x in (...) loop
  begin
    insert into .........;
  exception
  when others then
    dbms_output.put_line(sqlerrm);
  end;
end loop;

就可以了

#5


begin 
exception
end 

是比较常用的方法。 建议 LZ 多多考虑一下业务。

#1


在loop里面定义异常,捕获到异常以后使用go to 继续下次循环,我没试过,不过应该可行,你可以试一下

#2


CREATE OR REPLACE PROCEDURE testcursor 
is 
    yhjerror EXCEPTION; 
    myresult INT; 
BEGIN 
    myresult:=1;
    declare loopresult INT;
    declare 
        --类型定义 
        cursor c_job 
    ...
            loopresult:=SQL%ROWCOUNT; 
            IF ((loopresult<>1) OR (loopresult=0)) THEN 
                BEGIN 
                    loopresult:=myresult; 
                end;   
            END IF ;  
        end loop; 
        IF ((myresult<>1) OR (myresult=0)) THEN 
            BEGIN 
                RAISE yhjerror; 
            end;   
        END IF ;  
    end; 
EXCEPTION 
...

#3


没理解。
错误是你自己抛出来的,既然不想中断循环,就不要在循环中抛错误啊。
CREATE OR REPLACE PROCEDURE testcursor 
is 
    yhjerror EXCEPTION; 
    myresult INT; 
BEGIN 
    myresult:=1;
    declare loopresult INT;
    declare 
        --类型定义 
        cursor c_job 
    ...
            loopresult:=SQL%ROWCOUNT; 
            IF ((loopresult<>1) OR (loopresult=0)) THEN 
                BEGIN 
                    myresult:=loopresult; 
                end;   
            END IF ;  
        end loop; 
        IF ((myresult<>1) OR (myresult=0)) THEN 
            BEGIN 
                RAISE yhjerror; 
            end;   
        END IF ;  
    end; 
EXCEPTION 
...

#4


把begin exception end写在loop里面,形如

for x in (...) loop
  begin
    insert into .........;
  exception
  when others then
    dbms_output.put_line(sqlerrm);
  end;
end loop;

就可以了

#5


begin 
exception
end 

是比较常用的方法。 建议 LZ 多多考虑一下业务。