在PLSQL块中捕获错误

时间:2017-10-10 10:11:01

标签: sql oracle plsql

如果里面有一个包含1000个DML语句的PLSQL块,我们想知道哪个DML语句抛出了错误,那么我们怎么能找到它?

2 个答案:

答案 0 :(得分:0)

INSERT语句中使用LOG ERRORS INTO clause告诉您哪些数据导致异常:

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 |

答案 1 :(得分:-1)

使用SP进行记录(最好使用自治事务)。