处理唯一约束错误并尝试使用循环自动生成最多n次的唯一值

问题描述 投票:1回答:1

我正在尝试将自动生成的值插入表中。如果存在唯一约束错误,我想获取一个新值并将最新值插入表中。我想在抛出唯一约束错误之前尝试生成最多10次的唯一值。

这就是我到目前为止所拥有的。

BEGIN
    autoGenValue := x
FOR i in 1..10 LOOP
    BEGIN
      INSERT INTO mainTbl(A,
                   B, 
                   C)
      VALUES(autoGenValue,
               b,
               c ) 
    EXCEPTION
          WHEN DUP_VAL_ON_INDEX
            THEN
                SELECT lpad(NVL(MAX(SUBSTR(A, -2)), '00')+1,4,'0')
                INTO maxSeq
                FROM RecvTbl

                SELECT car_id||maxSeq
                INTO autoGenValue 
                FROM DUAL;

         WHEN OTHERS THEN
             EXIT;          
     END;
   END LOOP;

    UPDATE RecvTbl
         SET A = autoGenValue 
         WHERE A = x;  
END;
COMMIT;      

x是我最初计算的自动生成的值,我试图插入mainTbl。如果存在唯一约束错误,则遵循一些必需的逻辑(此处简化)以获得所需的唯一值。我试了10次(如果需要的话)。当没有唯一约束错误时退出,并且还将recvTbl更新为我需要的值以供将来计算。

使用我的代码我注意到,在插入mainTbl之后,即使没有唯一约束错误并且插入recvTbl中的值是增量值而不是mainTbl中的值,该值也会增加。

我有什么想法我做错了吗?

oracle plsql exception-handling insert-update unique-constraint
1个回答
2
投票

问题是你没有成功的退出.....

如果存在除DUP_VAL_ON_INDEX之外的任何错误,则退出循环,但如果插入成功则继续循环。

因此,下次循环时,您将获得DUP_VAL_ON_INDEX错误并增加。

您可以使用类似下面的内容(未经测试)来设置成功变量,然后在它成立时立即退出循环。

BEGIN
autoGenValue := x;
v_success := false;
FOR i in 1..10 LOOP
    BEGIN
      INSERT INTO mainTbl(A,
                   B, 
                   C)
      VALUES(autoGenValue,
               b,
               c ) ;
      v_success := true;
    EXCEPTION
          WHEN DUP_VAL_ON_INDEX
            THEN
                SELECT lpad(NVL(MAX(SUBSTR(A, -2)), '00')+1,4,'0')
                INTO maxSeq
                FROM RecvTbl

                SELECT car_id||maxSeq
                INTO autoGenValue 
                FROM DUAL;

     WHEN OTHERS THEN
     EXIT;          
     END;
     if v_success = true then
       exit;
     end if;
   END LOOP;

    UPDATE RecvTbl
         SET A = autoGenValue 
         WHERE A = x;  
END;
COMMIT;      
© www.soinside.com 2019 - 2024. All rights reserved.