在PLSQL块内部捕获错误

问题描述:

如果有一个包含1000个DML语句的PLSQL块,并且我们想要找出哪个DML语句抛出错误(如果有的话),那我们如何才能找出这个错误?在PLSQL块内部捕获错误

+0

编写一个异常块并处理故障。 – XING

+0

[DML和异常处理 - Oracle]的可能重复(https://*.com/questions/33540754/dml-and-exception-handling-oracle) – XING

+0

错误消息将指示失败的行。请添加一些关于您面临的情况的更多细节。 –

使用SP记录(最好使用自主事务)。

+0

这是作为答案发布的,但它非常简短,不能回答问题。它应该是一个评论,或者扩展为举例说明如何实施这个过程。 – MT0

+0

没有足够的代表评论。 – L30n1d45

使用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 |