代码之家  ›  专栏  ›  技术社区  ›  RBA

Oracle触发器不工作

  •  2
  • RBA  · 技术社区  · 15 年前

    我已经创建了一个触发器,它可以在如下两个表上工作: -在表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中的pk(字段ID)在表GEDFILES中是fk(字段ID)

    我不知道问题在哪里,哪怕是一个小问题。

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

    3 回复  |  直到 9 年前
        1
  •  4
  •   Leniel Maccaferri    15 年前

    简单的问题:你启用了触发器吗?

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

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

        2
  •  2
  •   Bob Jarvis - Слава Україні    15 年前

    这是一个使用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
  •  0
  •   RBA    10 年前

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

    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