【发布时间】:2012-09-11 09:57:06
【问题描述】:
我有外部表。我想从这些表中提取数据并将这些数据插入/合并到其他表中。
现在,当 select from => insert into query 或 merge query 运行时,有可能(并且很可能)数据质量很差,这将导致查询中断。假设外部表中有 000000 作为日期,如果我正在合并数据,这将导致查询中断。
如何将这些错误记录在一个表中(例如)错误表,该表将记录错误、错误原因、行号和列名?就像您在 SQL Loader 日志中看到的一样。例如:
Record 2324: Rejected - Error on table AA_STAG_VR_01, column KS1.
ORA-01843: not a valid month
而且查询不应该中断。而是记录错误并像在 SQL 加载器中发生的那样继续操作。
有可能吗?我试图在网上四处寻找,但我什么也找不到,或者我根本不知道神奇的词
提前致谢:-)
编辑: 好的,我能够使用以下方法解决问题(嗯,部分)。
CREATE TABLE error_table (
ora_err_number$ NUMBER,
ora_err_mesg$ VARCHAR2(2000),
ora_err_rowid$ ROWID,
ora_err_optyp$ VARCHAR2(2),
ora_err_tag$ VARCHAR2(2000)
)
INSERT INTO destination_table (column)
SELECT column FROM external_table
LOG ERRORS INTO error_table REJECT LIMIT UNLIMITED
这给了我:
SELECT * FROM error_table;
----------------------------------------------------------------------------------------------------------------------------------------------------------
ORA_ERR_NUMBER$ | ORA_ERR_MESG$ | ORA_ERR_ROWID$ | ORA_ERR_OPTYP$ | ORA_ERR_TAG$ |
----------------------------------------------------------------------------------------------------------------------------------------------------------
12899 |ORA-12899: value too large for column "SYSTEM"."destination_table"."column"
到目前为止,一切都很好。但是,我想知道哪个记录号(external_table 中的行号)有此错误。因为有可能前 10 条记录正常,但第 11 条记录不好。
【问题讨论】:
-
如果你用BADFILE
定义外部表,就会有你的坏记录。 AFAIK,不包含行号。 -
Thx,这也是我的发现,LOG ERRORS INTO 不会像 SQL 加载器在日志文件中那样给出记录号。
-
会的。检查我的答案
-
您的标题是指“errors”还是“eros”?坦率地说,作为“爱神”会更有趣......
标签: oracle plsql oracle11g plsqldeveloper