不匹配的记录重定向到错误表?

时间:2015-04-28 09:24:32

标签: mysql sql-server oracle

我正在尝试为ETL编写一个SQL,我试图将源表中的所有记录插入到目标表中,如果任何记录与目标表模式不匹配(错误包括超出列长度)目标和数据类型不匹配) - 因为这样的行应该被重定向到一个错误,我可以用'创建为'

动态创建

想知道设计SQL的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

  

(错误包括超出目标列长度和数据类型不匹配) - 因为这些行应重定向到我可以使用'create as'动态创建的错误

您无需手动执行任何操作,也无需重新发明轮子。

在Oracle中,您可以使用 Oracle 10g数据库第2版中引入的 DML错误记录功能。

错误记录的基本语法是:

LOG errors INTO error_logging_table_name [REJECT LIMIT <custom>/UNLIMITED];

要创建DML错误记录表,您可以:

  1. 使用 DBMS_ERRLOG包中的 CREATE_ERROR_LOG过程 或者,
  2. 手动创建表格。
  3. 让我们看一个例子:

    为了演示,我手动创建 DML错误记录表

    SQL> CREATE TABLE error_log_dml
      2    (
      3      ora_err_number$ NUMBER,
      4      ora_err_mesg$   VARCHAR2(2000),
      5      ora_err_rowid$ rowid,
      6      ora_err_optyp$ VARCHAR2(2),
      7      ora_err_tag$   VARCHAR2(2000)
      8    );
    
    Table created.
    
    SQL>
    

    让我们测试 DML错误记录功能

    SQL> CREATE TABLE t(A NUMBER NOT NULL);
    
    Table created.
    
    SQL>
    SQL> INSERT INTO t VALUES(NULL) LOG errors INTO error_log_dml REJECT LIMIT UNLIMITED;
    
    0 rows created.
    
    SQL>
    SQL> COLUMN ora_err_mesg$ format a75
    SQL>
    SQL> SELECT ora_err_mesg$ FROM error_log_dml;
    
    ORA_ERR_MESG$
    ---------------------------------------------------------------------------
    ORA-01400: cannot insert NULL into ("LALIT"."T"."A")
    
    SQL>
    

    所以,你可以看到错误现在记录在表格中。

    以上演示的功能适用于:

    • INSERT
    • 更新
    • DELETE
    • MERGE

    您可能也有兴趣查看New SQL*Plus error logging feature。当您使用SQL * Plus执行脚本时,它非常方便。

    更新标记您的错误消息。

    例如,

    SQL> DROP TABLE error_log_dml PURGE;
    
    Table dropped.
    
    SQL> DROP TABLE t PURGE;
    
    Table dropped.
    
    SQL> CREATE TABLE error_log_dml
      2    (
      3      ora_err_number$ NUMBER,
      4      ora_err_mesg$   VARCHAR2(2000),
      5      ora_err_rowid$ rowid,
      6      ora_err_optyp$ VARCHAR2(2),
      7      ora_err_tag$   VARCHAR2(2000)
      8    );
    
    Table created.
    
    SQL> CREATE TABLE t
      2    (A NUMBER
      3    );
    
    Table created.
    
    SQL> ALTER TABLE t ADD CONSTRAINT t_chk CHECK
      2  (
      3    a = 1
      4  )
      5  ;
    
    Table altered.
    
    SQL> INSERT INTO t VALUES
      2    (2
      3    ) LOG errors INTO error_log_dml(2) REJECT LIMIT UNLIMITED;
    
    0 rows created.
    

    让我们看一下错误表:

    SQL> SELECT ora_err_mesg$,ORA_ERR_TAG$ FROM error_log_dml;
    
    ORA_ERR_MESG$                                      ORA_ERR_TAG$
    -------------------------------------------------- ---------------
    ORA-02290: check constraint (LALIT.T_CHK) violated 2
    
    
    
    SQL>
    

    所以,我使用了 ORA_ERR_TAG $ 列来插入引发错误的值。

相关问题