gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:15:16 27 4
gpt4 key购买 nike

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

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

最佳答案

(errors include exceeding column length of target and datatype mismatch) - as such rows should be redirected to a error which I can create dynamically with '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. 手动创建表格。

让我们看一个例子:

为了演示,我手动创建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$ 列插入引发错误的值。

关于mysql - 不匹配的记录重定向到错误表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29915424/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com