如果是第一次ID承诺,我需要使用触发器在插入新条目时更新表。 (他们的第一个承诺)
我需要搜索表并查看id是否已存在,如果不存在,则应将firstpledge更新为“Y”,否则应将firstpledge更新为“N”。
现在我在触发器的select表中收到错误“exact fetch返回超过请求的行数”。我怎样才能解决这个问题?非常感谢任何帮助。
下面显示了我目前的代码:
Shruti
以下是我试图测试的方法:
CREATE OR REPLACE TRIGGER dd_firstpledge_trg
AFTER INSERT ON dd_pledge
DECLARE
lv_id dd_pledge.idpledge%TYPE;
BEGIN
SELECT idpledge
INTO lv_id
FROM dd_pledge;
IF lv_id = NULL THEN
UPDATE dd_pledge
SET firstpledge = 'Y'
WHERE firstpledge = NULL;
ELSE
UPDATE dd_pledge
SET firstpledge = 'N'
WHERE firstpledge = NULL;
END IF;
END;
/
show errors
以下是表格信息供参考:
INSERT INTO dd_pledge
VALUES(113, 303, '13-MAY-13', 1200, 503, 10, NULL, 0, 756, NULL);
SELECT * FROM dd_pledge;
答案 0 :(得分:1)
我的理解是,当您插入第一行时,您希望该标志等于Y
,否则为N
。
您的代码
SELECT idpledge
INTO lv_id
FROM dd_pledge;
返回错误,因为当您有多行时,Oracle不知道要分配给lv_id的值。
解决方案可以是使用
SELECT count(1) INTO lv_id 来自dd_pledge WHERE idProj =:new.idProj; - 你需要这个,否则你将得到所有项目的承诺
如果表为空,则lv_id将为0,否则表中的行数为。
当然,IF
语句也将成为:
IF lv_id = 0 THEN
此外,我会删除ELSE
分支并默认将标记设置为“N”。
答案 1 :(得分:0)
即使你使用count(1),它也会将NUll插入到新插入的pledge id中,原因是你正在使用这个语句来检查,
SELECT idpledge
INTO lv_id
FROM dd_pledge;
这将评估整个故事,因此它将返回多行,而pledgeId将始终与新输入的值分开“Y”或“N”。
要解决此问题,您必须使用
在select子句中引入where子句where pledgeid=:new.pledgeId -- (using for each row , in your trigger),
但即使这样也会产生一个变异表的问题,因为你要更新一个新插入的行,触发器可以看到新行未提交或回滚。
您必须重新修改逻辑或找到解决方法。