我有两张表receipts(rno,r_date,cid)
和item_list(rno,ordinal,item)
。收据中的rno是主键。如果收据号不存在,则使用我想在item_list
中使用序号value = 1
插入记录的过程。序数的类型是数字。这是代码:
CREATE OR REPLACE PROCEDURE insitem (num IN receipts.rno%type, itemid IN item_list.item%type)
IS
CURSOR c2 IS SELECT rno FROM receipts WHERE rno = num;
BEGIN
OPEN c2;
IF c2%notfound THEN
INSERT INTO item_list VALUES(num, 1, itemid);
ELSE
INSERT INTO item_list VALUES(num, (select MAX(ordinal) FROM item_list WHERE rno = num) + 1, itemid);
END IF;
END;
/
当我给出一个新的rno作为输入时,序数应为1,但我只得到一个空值。
答案 0 :(得分:2)
您尚未从光标中获取值,因此notfound
没有按预期执行,您总是进入else
。这更接近:
CREATE OR REPLACE PROCEDURE insitem (num IN receipts.rno%type,
itemid IN item_list.item%type)
IS
CURSOR c2 IS SELECT rno FROM receipts WHERE rno = num;
l_rno number;
BEGIN
OPEN c2;
FETCH c2 INTO l_rno;
IF c2%notfound THEN
INSERT INTO item_list VALUES(num, 1, itemid);
ELSE
INSERT INTO item_list VALUES(num,
(select MAX(ordinal) FROM item_list WHERE rno = num) + 1, itemid);
END IF;
CLOSE c2
END;
/
但如果rno
中的receipts
是item_list
中的PK而else
中的FK,那么您仍将始终进入INSERT INTO item_list
SELECT num, NVL(MAX(ordinal), 0) + 1, itemid
FROM item_list
WHERE rno = num;
,或获得约束异常。我认为你正在检查错误的表,如果是这样你真的不需要光标,你可以这样做:
{{1}}
但无论哪种方式,如果两个交易同时调用它,你就有可能重复序数。