簡體   English   中英

處理異常 pl/sql : 獲取發生異常的值

[英]handle exception pl/sql : get value where exception occured

我正在使用此代碼

BEGIN
EXECUTE IMMEDIATE 'INSERT INTO MY_TABLE (A, B , C)
                  SELECT TABLE_2.A, TABLE_2.B, TABLE_2.C
                  FROM TABLE_2
                  WHERE TABLE_2.A in (val1,val2,val3) ';

EXCEPTION WHEN OTHERS then 
                PROC_EXCEPTION('ERROR',TABLE_2.B,SQLCODE,SQLERRM);
END;

我收到以下編譯錯誤:

TABLE_2.B must be declared

如何獲取發生異常的TABLE_2.B的值並將其傳遞給處理異常的過程?

您需要使用子句LOG ERRORS INTO https://oracle-base.com/articles/10g/dml-error-logging-10gr2

要創建錯誤日志表,請使用https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_errlog.htm#CEGBBABI

然后插入完成后,您可以處理錯誤表中的記錄。

您不能在EXECUTE IMMEDIATE塊之外引用TABLE.A ...

嘗試:

BEGIN
EXECUTE IMMEDIATE 'INSERT INTO MY_TABLE (A, B , C)
              SELECT TABLE_2.A, TABLE_2.B, TABLE_2.C
              FROM TABLE_2
              WHERE TABLE_2.A in (val1,val2,val3) ';

EXCEPTION WHEN OTHERS then 
            PROC_EXCEPTION('ERROR with TABLE_2.B',SQLCODE,SQLERRM);
END;

要為TABLE_2.B請循環執行:

BEGIN
  for x in (SELECT TABLE_2.A, TABLE_2.B, TABLE_2.C
              FROM TABLE_2
              WHERE TABLE_2.A in (val1,val2,val3))
  loop
    begin
      execute immediate 'INSERT INTO MY_TABLE (A, B , C) values ('||x.A||','||x.B||','||x.C||')';
        EXCEPTION WHEN OTHERS then 
           PROC_EXCEPTION('ERROR with'|| x.B,SQLCODE,SQLERRM);
    end;
  end loop;

END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM