【问题标题】:Error unique constraint and during execution of trigger oracle错误唯一约束和触发oracle执行期间
【发布时间】:2020-01-28 21:39:19
【问题描述】:

我有一个表格,用户可以在其中添加新生婴儿的信息和他/她的姓氏。将信息添加到表中时出现以下错误

ORA-00001: unique constraint (PK) violated
ORA-06512: at trigger_name, line 21
ORA-04088: error during execution of trigger

触发器:

CREATE OR REPLACE TRIGGER "DB_NAME"."TRG_NBB" 
AFTER INSERT ON baby
FOR EACH ROW
 WHEN (new.status = 'A') DECLARE
 v_1 tab_1.col_1%type;
 v_2 tab_2.col_2%type;
 v_3 tab_2.col_3%type;
 v_4 tab_2.col_4%type;
 v_5 tab_2.col_5%type;
 v_6 date;
 newmofid number;

BEGIN
 select max(nvl(col_2,0))+1 into newmofid from tab_2;
 SELECT distinct col_1,col_2,to_char(col,'DD-MM-YYYY') INTO v_1,v_2,v_6
 from table
 where tcid = :new.tcid;

 SELECT col_4,col_5,col_3 into v_4,v_5,v_3
 from tab_2
 where col_1 = v_1
 and col_2 = v_2; 

 INSERT INTO tab_2 (all_columns)
 VALUES(variable_names);

 DBMS_OUTPUT.PUT_LINE('New Born Baby successfully added to member table');
END trg_nbb;
/
ALTER TRIGGER "DB_NAME"."TRG_NBB" ENABLE;

当我执行这个 sql 查询时,需要 4 到 5 秒,并且值会很快增加

select max(nvl(col_2,0))+1 into newmofid from tab_2;

结果:

6030819791

再次执行需要 3 到 4 秒

结果:

6030819798

如何解决这个问题?

谢谢

【问题讨论】:

    标签: oracle plsql oracle11g database-trigger


    【解决方案1】:

    我怀疑是MAX + 1 引起了问题:

    select max(nvl(col_2,0))+1 into newmofid from tab_2;
    

    这样的原则在大多数情况下是错误的并且会失败,尤其是在多用户环境中,其中两个(或更多)用户同时获取相同的MAX + 1 值,进行一些处理,并且 - 当时插入 - 其中一个成功(因为它是第一个),但其余的失败,因为表中已经存在这样的值。

    我建议你切换到一个序列,例如

    create sequence seq_baby;
    

    然后,以你的形式,做

    select seq_baby.nextval into newmofid from dual;
    

    【讨论】:

    • 这部分需要加触发器吗? select seq_baby.nextval into newmofid from dual;
    • 是的,而不是select max(nvl(col_2,0))+1 into newmofid from tab_2;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多