首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle:在触发器中使用子查询

Oracle:在触发器中使用子查询
EN

Stack Overflow用户
提问于 2009-05-26 06:20:06
回答 3查看 18.2K关注 0票数 4

如何解决Oracle不允许在触发器中使用子查询的限制?

下面是我试图创建的一个示例触发器,但由于不能使用子查询而无法创建。

代码语言:javascript
复制
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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-26 09:09:08

此触发器将完成此操作:

代码语言:javascript
复制
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;

我假设select from projects将始终找到一行;如果不是,它将引发您可能需要处理的NO_DATA_FOUND异常。

票数 9
EN

Stack Overflow用户

发布于 2009-05-26 09:08:59

我希望你想要像这样的东西

代码语言:javascript
复制
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;
票数 5
EN

Stack Overflow用户

发布于 2009-05-26 06:25:49

你能把条件放到动作中(在BEGIN和END之间),而不是放在“是否触发”中吗?是的,这意味着触发器主体可能会更频繁地被触发-但如果它能让你绕过这个问题……

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/909156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档