2017-10-10 83 views
0

如果有一個包含1000個DML語句的PLSQL塊,並且我們想要找出哪個DML語句拋出錯誤(如果有的話),那我們如何才能找出這個錯誤?在PLSQL塊內部捕獲錯誤

+0

編寫一個異常塊並處理故障。 – XING

+0

[DML和異常處理 - Oracle]的可能重複(https://stackoverflow.com/questions/33540754/dml-and-exception-handling-oracle) – XING

+0

錯誤消息將指示失敗的行。請添加一些關於您面臨的情況的更多細節。 –

回答

-1

使用SP記錄(最好使用自主事務)。

+0

這是作爲答案發布的,但它非常簡短,不能回答問題。它應該是一個評論,或者擴展爲舉例說明如何實施這個過程。 – MT0

+0

沒有足夠的代表評論。 – L30n1d45

0

使用LOG ERRORS INTO clauseINSERT語句來告訴你哪些數據引起異常:

SQL Fiddle

的Oracle 11g R2架構設置

CREATE TABLE table_name (
    value INTEGER 
     CONSTRAINT MOD5_CHK CHECK (MOD(value, 5) > 0) 
) 
/

BEGIN 
    DBMS_ERRLOG.CREATE_ERROR_LOG('table_name', 'errlog'); 
END; 
/

DECLARE 
    check_violated EXCEPTION; 
    PRAGMA EXCEPTION_INIT(check_violated, -2290); 
BEGIN 
    INSERT INTO table_name (value) 
    SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 13 
    LOG ERRORS INTO errlog ('error') REJECT LIMIT 0; 
EXCEPTION 
    WHEN check_violated THEN 
    NULL; 
END; 
/

查詢1

SELECT * FROM table_name 

Results

沒有結果

查詢2

SELECT ORA_ERR_MESG$, ORA_ERR_TAG$, value FROM errlog 

Results

|             ORA_ERR_MESG$ | ORA_ERR_TAG$ | VALUE | 
|----------------------------------------------------------------|--------------|-------| 
| ORA-02290: check constraint (USER_4_4E3503.MOD5_CHK) violated |  error |  5 |