首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >处理唯一约束错误并尝试使用循环自动生成最多n次的唯一值

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

Stack Overflow用户
提问于 2018-09-07 07:53:28
回答 1查看 176关注 0票数 1

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

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

代码语言:javascript
复制
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

在我的代码中,我注意到即使在没有唯一约束错误并且recvTbl中插入的值是递增的值而不是mainTbl中的值的情况下,插入到mainTbl中的值也会递增。

你知道我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-07 09:22:01

问题是你在成功时没有退路……

如果出现DUP_VAL_ON_INDEX以外的任何错误,则退出循环,但如果插入成功,则继续循环。

因此,在下一次循环中,您将得到一个DUP_VAL_ON_INDEX错误和增量。

您可以使用类似下面的代码(未测试)来设置一个成功变量,然后在该变量为真时立即退出循环。

代码语言:javascript
复制
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;      
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52213511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档