我正在尝试将自动生成的值插入到表中。如果存在唯一约束错误,我希望获得一个新值并将最新的值插入到表中。在抛出唯一约束错误之前,我想尝试生成最多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
。
在我的代码中,我注意到即使在没有唯一约束错误并且recvTbl
中插入的值是递增的值而不是mainTbl
中的值的情况下,插入到mainTbl
中的值也会递增。
你知道我做错了什么吗?
发布于 2018-09-07 09:22:01
问题是你在成功时没有退路……
如果出现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;
https://stackoverflow.com/questions/52213511
复制相似问题