0

I want to write a sql plus error for when the oracle find a record, or more records, that already exist and just ignore it/them. This is a example:

sqlError=`egrep "ORA-[0-9][0-9][0-9][0-9][0-9]" ${FILE_SPOOL_DAT} | awk '{print $0}';`   
if test ! -f ${FILE_SPOOL_DAT}
then
   echo "Error request " >> ${FILE_SPOOL_DAT}
else
   if [ ! "$sqlError" = "" ] #controls if the variable $sqlError contains a value different from spaces, i think this is the point to change
   then
      echo "Error $sqlError" >> ${FILE_SPOOL_DAT} 
   fi
fi

In this example sqlplus controls if the variable $sqlError contains a value different from spaces. How can i change this condition put the DUPKEY error? Thanks

4

3 回答 3

2

如果您使用的是 11g,则IGNORE_ROW_ON_DUPKEY_INDEX提示会有所帮助。

SQL> create table table1(a number primary key);

Table created.

SQL> insert into table1 values(1);

1 row created.

SQL> insert into table1 values(1);
insert into table1 values(1)
*
ERROR at line 1:
ORA-00001: unique constraint (JHELLER.SYS_C00810741) violated


SQL> insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(table1(a))*/ into table1 values(1);

0 rows created.
于 2013-06-19T18:48:56.537 回答
0

咳咳,太危险了!如果Oracle 发现一个或多个已经存在的记录,它通常会回滚该事务。抑制相关的错误消息为时已晚。

一个更好的地方是指示 Oracle 在 期间直接忽略重复记录INSERT,例如使用以下MERGE命令:

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_9016.htm#i2081218

于 2013-06-19T12:02:16.300 回答
0

当您收到重复键错误时,这实际上意味着您违反了在表上设置的约束。假设设计表格的人理解数据模型,那么您想要做的就是一个坏主意。如果设计不好,请通过删除约束来更改表的元数据。

MERGE 命令可以让您解决它,我对此表示怀疑,但是随着随后留下的数据混乱,我认为不值得冒险。

如果你只是在玩,无论如何都要删除约束。我不知道您的表是如何设置的,但您可能需要ALTERorDROPCREATE 一个索引或ALTER表。

如果这是为生产而开发的,因此是有偿工作的,请不要在不与最初设计表格的人交谈的情况下绕过限制。

于 2013-06-19T12:17:08.567 回答