【问题标题】:Oracle trigger which doesn't workOracle 触发器不起作用
【发布时间】:2011-03-16 19:27:33
【问题描述】:

我创建了一个触发器,它适用于 2 个这样的表: - 在表 A (GEDDFILES) 上插入新行时,表 B(GEDDIRS) 上的数字字段将增加。

代码正在编译且没有错误,但它不起作用。代码如下:

CREATE OR REPLACE TRIGGER "A"."TRGMAJNRFIC" AFTER
INSERT ON "A"."GEDFILES" FOR EACH ROW DECLARE 
 wtmpnrfic number;

BEGIN 
 SELECT MAX(OBJNRFICHIERS) INTO wtmpnrfic from GEDDirs WHERE ID= :new.ID;
 UPDATE GEDDirs SET OBJNRFICHIERS = wtmpnrfic+1 WHERE ID=:new.id;
END;

表已标准化,来自 GEDDIRS(字段 ID)的 PK 是表 GEDFILES(字段 ID)中的 FK

我不知道问题出在哪里,即使是一个小问题。

表 GEDFILES 中的字段 OBJNRFICHIERS 为空。当我试图增加它的价值时,这会是一个问题吗?

【问题讨论】:

  • 看起来您正试图在表中维护“记录数”。您应该意识到,在存在并发会话的情况下,这将不起作用,为相同的GEDDirs.ID 添加新行到GEDFILESOBJNRFICHIERS 中的数据很可能会变成垃圾。
  • 是的,你是对的!我应该如何解决这个问题?你能给出一个替代解决方案吗?最好的问候,
  • 添加 DBMS_OUTPUT.PUT_LINE('tirgger works' );为您的触发器并连接到 dmbs 输出。

标签: oracle triggers


【解决方案1】:

我已经解决了。问题是 OBJNRFICHIERS 字段为空。触发代码如下

CREATE OR REPLACE TRIGGER "A"."TRGMAJNRFIC" AFTER
INSERT ON "A"."GEDFILES" FOR EACH ROW DECLARE 
 wtmpnrfic number;

BEGIN 
 SELECT MAX(OBJNRFICHIERS) INTO wtmpnrfic from GEDDirs WHERE ID= :new.ID;
 IF wtmpnrfic IS NULL then wtmpnrfic :=0;
 ELSE wtmpnrfic := wtmpnrfic+1;
 UPDATE GEDDirs SET OBJNRFICHIERS = wtmpnrfic+1 WHERE ID=:new.id;
 END IF;
END;

谢谢大家的建议,也欢迎其他建议!为所有答案 +1

【讨论】:

    【解决方案2】:

    这是使用 NVL2 使代码更简洁的理想场所:

    CREATE OR REPLACE TRIGGER "A"."TRGMAJNRFIC"
      AFTER INSERT ON "A"."GEDFILES"
      FOR EACH ROW
    DECLARE  
      wtmpnrfic number;  
    BEGIN  
      SELECT MAX(OBJNRFICHIERS)
        INTO wtmpnrfic
        from GEDDirs
        WHERE ID = :new.ID; 
    
      UPDATE GEDDirs
        SET OBJNRFICHIERS = NVL2(wtmpnrfic, 0, wtmpnrfic+1);
        WHERE ID = :new.ID; 
      END IF; 
    END;
    

    或者,如果您愿意,可以使用 COALESCE 替换上面的 NVL2 行:

        SET OBJNRFICHIERS = COALESCE(wtmpnrfic+1, 0);
    

    或者,我想,NVL 也可以:

        SET OBJNRFICHIERS = NVL(wtmpnrfic+1, 0);
    

    分享和享受。

    【讨论】:

      【解决方案3】:

      简单问题:您是否启用了触发器?

      http://www.techonthenet.com/oracle/triggers/enable.php

      编辑:现在我看到您描述表 GEDFILES 中的 OBJNRFICHIERS 为空。在该列上放置 0(零)并运行测试......可能这就是问题所在! :)

      【讨论】:

      • 是的。我现在启用了触发器并运行了一个“提交”。我现在做了一个测试,但不起作用。
      • 在表 GEDDFILES 上插入一行后,您要提交吗?
      • 您是否在表 GEDFILES 的 OBJNRFICHIERS 列中插入了值 0?
      • 我没有看到你的帖子,但这是我所做的,现在它正在工作。解决方案如下。谢谢!最好的问候
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 2023-03-15
      相关资源
      最近更新 更多