使用插入的procedure-null值插入

时间:2014-03-09 07:16:37

标签: sql plsql oracle10g

我有两张表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,但我只得到一个空值。

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中的receiptsitem_list中的PK而else中的FK,那么您仍将始终进入INSERT INTO item_list SELECT num, NVL(MAX(ordinal), 0) + 1, itemid FROM item_list WHERE rno = num; ,或获得约束异常。我认为你正在检查错误的表,如果是这样你真的不需要光标,你可以这样做:

{{1}}

但无论哪种方式,如果两个交易同时调用它,你就有可能重复序数。