Триггер Oracle, который не работает - PullRequest
2 голосов
/ 16 июля 2010

Я создал триггер, который работает с двумя таблицами, например так: - при вставке новой строки в таблицу 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;

Таблицы нормализованы, а PK из GEDDIRS (идентификатор поля) равен FK в таблице GEDFILES (идентификатор поля)

Я не могу понять, где проблема, даже маленькая.

Поле OBJNRFICHIERS из таблицы GEDFILES равно нулю. Может ли это быть проблемой, когда я пытаюсь увеличить ее значение?

Ответы [ 3 ]

4 голосов
/ 16 июля 2010

Простой вопрос: вы включили свой триггер?

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

Изменить: Теперь я увидел, что вы описали, что OBJNRFICHIERS из таблицы GEDFILES является нулевым. Поставьте 0 (ноль) в этот столбец и запустите тест ... Возможно, это проблема! :)

2 голосов
/ 16 июля 2010

Это идеальное место, чтобы использовать 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);

Делись и наслаждайся.

0 голосов
/ 16 июля 2010

Я решил это.проблема была в том, что поле 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 за все ответы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...