处理唯一约束错误并尝试使用循环自动生成最多 n 次的唯一值
Handling unique constraint error and trying to auto generate a unique value upto n times using a loop
我正在尝试将自动生成的值插入 table。如果存在唯一约束错误,我想获取一个新值并将最新值插入table。在抛出唯一约束错误之前,我想尝试生成最多 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
.
中的值
知道我做错了什么吗?
问题是你没有成功退出......
如果出现除 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;
我正在尝试将自动生成的值插入 table。如果存在唯一约束错误,我想获取一个新值并将最新值插入table。在抛出唯一约束错误之前,我想尝试生成最多 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
.
知道我做错了什么吗?
问题是你没有成功退出......
如果出现除 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;