我正在尝试为ETL编写一个SQL,我试图将源表中的所有记录插入到目标表中,如果任何记录与目标表模式不匹配(错误包括超出列长度)目标和数据类型不匹配) - 因为这样的行应该被重定向到一个错误,我可以用'创建为'
动态创建想知道设计SQL的最佳方法是什么?
答案 0 :(得分:1)
(错误包括超出目标列长度和数据类型不匹配) - 因为这些行应重定向到我可以使用'create as'动态创建的错误
您无需手动执行任何操作,也无需重新发明轮子。
在Oracle中,您可以使用 Oracle 10g数据库第2版中引入的 DML错误记录功能。
错误记录的基本语法是:
LOG errors INTO error_logging_table_name [REJECT LIMIT <custom>/UNLIMITED];
要创建DML错误记录表,您可以:
让我们看一个例子:
为了演示,我手动创建 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>
所以,你可以看到错误现在记录在表格中。
以上演示的功能适用于:
您可能也有兴趣查看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 $ 列来插入引发错误的值。