首页 > 解决方案 > Oracle 使用拒绝无限条款

问题描述

有人可以修改下面的 INSERT 代码以使用拒绝无限制条款并将错误记录在 err$_t

当我尝试实现以下内容时,我遇到了语法错误。可以这样使用子句吗?

create table t(val1 NUMBER(4 ) );


 ALTER TABLE t
     ADD ( CONSTRAINT t_pk
   PRIMARY KEY (val1));


 exec dbms_errlog.create_error_log ( 't' );

 INSERT INTO T(val1)
 WITH cte AS
  (
  SELECT 1 from dual 
   UNION ALL
  SELECT 1 from dual
  )
  SELECT * from cte;

标签: oracle

解决方案


log errors在语句末尾添加子句INSERT

SQL> create table t(val1 number primary key);

Table created.

SQL> exec dbms_errlog.create_error_log ('t');

PL/SQL procedure successfully completed.

SQL> insert into t(val1)
  2  with cte as
  3  (
  4      select 1 from dual
  5      union all
  6      select 1 from dual
  7  )
  8  select * from cte
  9  log errors into err$_t ('TEST')
 10  reject limit unlimited;

1 row created.

SQL> select count(*) rows_inserted from t;

ROWS_INSERTED
-------------
            1

SQL> select count(*) rows_with_errors from err$_t;

ROWS_WITH_ERRORS
----------------
               1

SQL>

请注意我是如何使用 SQL*Plus 来演示代码的。该程序适合开发代码,但有助于创建简单、可重现的测试用例。几乎每个 Oracle 开发人员都可以使用该工具,它准确地显示了每个命令的运行方式,包括完整的错误消息。

(为您的问题添加语法突出显示的一种快速方法是选择代码并单击“代码示例”按钮,即两个大括号。)


推荐阅读