如何比较SQL中同一个表中的多行?

时间:2015-04-26 20:53:00

标签: sql oracle

如果是第一次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;

2 个答案:

答案 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),

但即使这样也会产生一个变异表的问题,因为你要更新一个新插入的行,触发器可以看到新行未提交或回滚。

您必须重新修改逻辑或找到解决方法。