2014-04-02 13 views
2

執行下面的PL/SQL塊:如何在獲取失敗的行後繼續使用oracle遊標?

declare 
    cursor c1 is 
     select rownum r1, 
     5/ 
     case when r = 5 then 0 else 1 end 
     dzero, r from 
     (
     SELECT RowNum r FROM dual CONNECT BY level <= 10 
    ) 
     ; 
BEGIN 

    dbms_output.enable(buffer_size => NULL); 

    begin 
    FOR c1_rec in c1 
    LOOP 
      dbms_output.put_line('val: ' || c1_rec.r1); 
    END LOOP; 
    EXCEPTION 
    WHEN OTHERS THEN 
    dbms_output.put_line('Error: '||SQLCODE||' -ERROR- '||SQLERRM); 
    end; 

END; 

輸出是:

val: 1 
val: 2 
val: 3 
val: 4 
Error: -1476 -ERROR- ORA-01476: divisor is equal to zero 

鑑於C1不變,如何使光標查詢繼續獲取6-10th行,因此輸出是否繼續顯示以下內容?

val: 6 
val: 7 
val: 8 
val: 9 
val: 10 

回答

2

我認爲沒有辦法捕捉這個異常。正確的做法是使用NULLIF來避免除以零,但您必須更改查詢:

DECLARE 
    CURSOR c1 IS 
    SELECT rownum r1, 
      5/NULLIF(CASE WHEN r = 5 THEN 0 ELSE 1 END, 0) dzero, 
      r 
    FROM (SELECT RowNum r FROM dual CONNECT BY level <= 10) ; 
BEGIN 
    dbms_output.enable(buffer_size => NULL); 

    FOR c1_rec in c1 LOOP 
    dbms_output.put_line('val: ' || c1_rec.r1); 
    END LOOP; 
END; 
相關問題