【问题标题】:SQL Loader like errors in a tableSQL Loader 类似于表中的错误
【发布时间】: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


【解决方案1】:

查看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                                                                  

【讨论】:

    【解决方案2】:

    在某些语法下,你有拒绝限制,就像在 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>;
    

    请参阅 here 一些示例和 here 文档

    【讨论】:

    • 谢谢,但我已经安装了外部表,没有任何大问题。我更专注于从外部表中获取数据到目标表中。我对我的问题进行了一些修改:-)
    猜你喜欢
    • 2018-02-12
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 2015-08-29
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多