【问题标题】:How can i ignore dupkey with sqlplus?如何使用 sqlplus 忽略 dupkey?
【发布时间】:2013-06-15 20:39:01
【问题描述】:

我想为 oracle 找到一条或多条已经存在的记录而忽略它/它们时编写一个 sql plus 错误。这是一个例子:

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

在本例中,sqlplus 控制变量$sqlError 是否包含不同于空格的值。我怎样才能改变这个条件把DUPKEY 错误?谢谢

【问题讨论】:

  • 你写的和SQL*Plus没有关系……在这之前你在做什么?

标签: oracle unix sqlplus ksh on-duplicate-key


【解决方案1】:

如果您使用的是 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.

【讨论】:

    【解决方案2】:

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

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

    如果你只是在玩,无论如何都要移除约束。我不知道你的桌子是怎么布置的, 但您可能必须ALTERDROPCREATE 索引,或ALTER 表。

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

    【讨论】:

    • 你认为unix方式不是解决这个问题的好主意吗?
    • 问题不在于操作系统。解决问题的方法:不要插入重复;更改约束/索引;从同事那里获得一些帮助,了解他们如何处理这个问题。你目前的方法永远行不通——你必须改变你对问题的看法。
    • 哦,谢谢,我是 unix 和 oracle 的新手,对不起.. 我的老板告诉我使用 sql 代码,但我不知道它是如何工作的,以及它是否正确:(跨度>
    【解决方案3】:

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

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

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

    【讨论】:

    • 如果它们是单独的插入,Oracle 将不会回滚事务......因为没有关于实际发生的信息的信息,此声明完全没有根据。同样,MERGE 不会忽略重复项,它会引发一个错误,指出它无法获得一组稳定的行...
    • @Ben OP greps SPOOL 的输出,因此可以相当安全地假设他使用的是 SQL*Plus,并且很可能脚本已经完成。那么这笔交易发生了什么?哪些 INSERTS 经历了低谷,哪些被拒绝了?这不是解决问题的好方法,不是吗?同样,MERGE 当然不会检测到目标表中的重复记录,但可以指示如何在传入记录与现有记录重复的情况下做出反应......
    • 那么伙计们,最好的方法是什么?
    • 您能否向我们展示您的一些发现已存在记录的语句?
    猜你喜欢
    • 2012-04-04
    • 2021-11-19
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2010-09-12
    • 2019-10-27
    • 2013-06-07
    相关资源
    最近更新 更多