您好我想在手动创建的表中捕获我的DML操作的所有Oracle错误,其中列为ErrorID
和Error_Descr
。
如何在上面的列中获取ORA_ERR_NUMBER$
和ORA_ERR_MESG$
值?
此表还包含用户定义的错误,因此我不想将其限制为Oracle错误。
有没有办法在用户定义的表中捕获Oracle以及用户定义的错误?
提前致谢!
答案 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