4

如何解决 Oracle 不允许触发器中的子查询的限制。

这是我尝试创建的示例触发器,但由于无法使用子查询而无法创建。

CREATE OR REPLACE TRIGGER trigger_w_subquery
AFTER UPDATE OR INSERT ON project_archiving
FOR EACH ROW WHEN (old.archiving_status <> new.archiving_status
  AND new.archiving_status = 1
  AND (SELECT offer FROM projects WHERE projnum = :new.projnum) IS NULL
)
BEGIN
  INSERT INTO offer_log (offer, status, date)
  VALUES (null, 9, sysdate);
END;
4

3 回答 3

9

这个触发器会这样做:

CREATE OR REPLACE TRIGGER trigger_w_subquery
AFTER UPDATE OR INSERT ON project_archiving
FOR EACH ROW WHEN (old.archiving_status <> new.archiving_status
  AND new.archiving_status = 1
)
DECLARE
  l_offer projects.offer%TYPE;
BEGIN
  SELECT offer INTO l_offer 
  FROM projects 
  WHERE projnum = :new.projnum;

  IF l_offer IS NULL THEN
    INSERT INTO offer_log (offer, status, date)
    VALUES (null, 9, sysdate);
  END IF;
END;

我假设从项目中选择总是会找到一行;如果不是,它将引发您可能需要处理的 NO_DATA_FOUND 异常。

于 2009-05-26T09:09:08.320 回答
5

我希望你想要类似的东西

CREATE OR REPLACE TRIGGER trigger_w_subquery
AFTER UPDATE OR INSERT ON project_archiving
FOR EACH ROW 
WHEN (old.archiving_status <> new.archiving_status
  AND new.archiving_status = 1)
DECLARE
  l_offer projects.offer%TYPE;
BEGIN
  SELECT offer 
    INTO l_offer
    FROM projects 
   WHERE projnum = :new.projnum;

  IF( l_offer IS NULL )
  THEN
    INSERT INTO offer_log (offer, status, date)
      VALUES (null, 9, sysdate);
  END IF;
END;
于 2009-05-26T09:08:58.790 回答
2

您可以将条件放入操作(在 BEGIN 和 END 之间)而不是“是否触发”中吗?是的,这意味着触发器体可能会更频繁地触发 - 但如果它能让你解决问题......

于 2009-05-26T06:25:49.133 回答