捕获手动创建的表中的Oracle错误

时间:2018-04-25 06:23:58

标签: oracle oracle11g

您好我想在手动创建的表中捕获我的DML操作的所有Oracle错误,其中列为ErrorIDError_Descr。 如何在上面的列中获取ORA_ERR_NUMBER$ORA_ERR_MESG$值? 此表还包含用户定义的错误,因此我不想将其限制为Oracle错误。

有没有办法在用户定义的表中捕获Oracle以及用户定义的错误?

提前致谢!

1 个答案:

答案 0 :(得分:1)

根据文件Link

只有在包含这些必填列的情况下,Oracle才允许您为LOGGING使用手动创建的表。

ORA_ERR_NUMBER$
ORA_ERR_MESG$
ORA_ERR_ROWID$
ORA_ERR_OPTYP$
ORA_ERR_TAG$

如果您希望其他列捕获这两列中的信息,可以将它们设为虚拟列。

CREATE TABLE my_log_table (
    ORA_ERR_NUMBER$ NUMBER
    ,ORA_ERR_MESG$ VARCHAR2(2000)
    ,ORA_ERR_ROWID$ ROWID
    ,ORA_ERR_OPTYP$ VARCHAR2(2)
    ,ORA_ERR_TAG$ VARCHAR2(2000)
    ,ErrorID NUMBER AS (COALESCE(ORA_ERR_NUMBER$, ORA_ERR_NUMBER$))
    ,Error_Descr VARCHAR2(2000) AS (COALESCE(ORA_ERR_MESG$, ORA_ERR_MESG$))
    );

使用COALESCE是一种黑客攻击,因为Oracle不允许您直接将一列默认为另一列。

现在,您可以运行错误记录dml,通常会提到日志记录表名称。

INSERT INTO t_emp
SELECT employee_id * 10000
    ,first_name
    ,last_name
    ,hire_date
    ,salary
    ,department_id
FROM hr.employees
WHERE salary > 10000 LOG ERRORS
INTO my_log_table('ERR_SAL_LOAD') REJECT LIMIT 25

0 row(s) inserted.

select ORA_ERR_TAG$,ErrorID,Error_Descr FROM my_log_table ;

ORA_ERR_TAG$    ERRORID ERROR_DESCR
ERR_SAL_LOAD    1438    ORA-01438: value larger than specified precision allowed for this column
ERR_SAL_LOAD    1438    ORA-01438: value larger than specified precision allowed for this column