我有外部表格。我想从这些表中提取数据,并将这些数据插入/合并到其他表中。
现在当选择来自=>插入查询或合并查询运行然后可能(并且可能)数据可能质量差,这将导致查询中断。假设外部表中有000000作为日期,如果我正在合并数据,将导致查询中断。
如何在表(例如)错误表中记录这些错误,该错误表将记录错误,错误原因,行号和列名?就像你在SQL Loader日志中看到的那样。例如:
Record 2324: Rejected - Error on table AA_STAG_VR_01, column KS1.
ORA-01843: not a valid month
而且查询不应该破坏。而是记录错误并继续前进,就像在SQL Loader中一样。
有可能吗?我试着环顾网但我无法找到任何东西,或者我只是不知道神奇的话语
提前致谢: - )
编辑: 好的,我能够使用以下方法解决问题(部分)。
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条记录不好。
答案 0 :(得分:2)
查看FORALL + SAVE EXCEPTIONS条款。它可能对你有帮助。
15:57:02 @> conn hr/hr@vm_xe
Connected.
15:57:15 HR@vm_xe> create table err_test(unique_column number primary key);
Table created.
Elapsed: 00:00:01.51
15:57:46 HR@vm_xe> EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('err_test', 'errlog');
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.46
15:59:22 HR@vm_xe> insert into err_test select mod(rownum, 2) from dual connect by rownum < 10
16:00:00 2 log errors into errlog ('test') reject limit unlimited;
2 rows created.
Elapsed: 00:00:00.87
16:00:27 HR@vm_xe> commit;
Commit complete.
Elapsed: 00:00:00.00
16:02:37 HR@vm_xe> col ora_err_mesg$ for a75
16:02:43 HR@vm_xe> col unique_column for a10
16:02:47 HR@vm_xe> select unique_column, ora_err_mesg$ from errlog;
UNIQUE_COL ORA_ERR_MESG$
---------- ---------------------------------------------------------------------------
1 ORA-00001: unique constraint (HR.SYS_C007056) violated
0 ORA-00001: unique constraint (HR.SYS_C007056) violated
1 ORA-00001: unique constraint (HR.SYS_C007056) violated
0 ORA-00001: unique constraint (HR.SYS_C007056) violated
1 ORA-00001: unique constraint (HR.SYS_C007056) violated
0 ORA-00001: unique constraint (HR.SYS_C007056) violated
1 ORA-00001: unique constraint (HR.SYS_C007056) violated
7 rows selected.
Elapsed: 00:00:00.03
答案 1 :(得分:1)
在某些语法下,你有拒绝限制,如sqlloader,你有日志文件,坏文件等。
CREATE TABLE <table_name> (
<column_definitions>)
ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY <oracle_directory_object_name>
ACCESS PARAMETERS (
RECORDS DELIMITED BY newline
BADFILE <file_name>
DISCARDFILE <file_name>
LOGFILE <file_name>
[READSIZE <bytes>]
[SKIP <number_of_rows>
FIELDS TERMINATED BY '<terminator>'
REJECT ROWS WITH ALL NULL FIELDS
MISSING FIELD VALUES ARE NULL
(<column_name_list>))\
LOCATION ('<file_name>'))
[PARALLEL]
REJECT LIMIT <UNLIMITED | integer>;