2010-07-16 7 views
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) 테이블 GEDFILES에서 FK (필드 ID) 문제, 심지어 인 곳

알아낼 수 없다에서 정규화 PK있다 어린이.

테이블 GEDFILES의 OBJNRFICHIERS 필드가 null입니다. 가치를 높이려고 할 때이 문제가 될 수 있습니까?

+1

테이블에 "레코드 수"를 유지하려고하는 것 같습니다. 같은'GEDDirs.ID'에 대해'GEDFILES'에 새로운 행을 추가하는 동시 세션이있을 때 이것이 작동하지 않는다는 것을 알아야합니다. 'OBJNRFICHIERS'의 데이터는 쓰레기가 될 가능성이 있습니다. –

+0

네, 맞습니다! 어떻게 해결해야합니까? 대체 솔루션을 줄 수 있습니까? 안부 인사, – RBA

+0

추가 DBMS_OUTPUT.PUT_LINE (​​'tirgger works'); 당신의 방아쇠를 당기고 dmbs 출력에 연결하십시오. – deathangel908

답변

0

나는 그것을 해결했다. 문제는 OBJNRFICHIERS 필드가 null이라는 것입니다. 트리거 코드는 울부 짖음

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; 

제안 사항에 모두 감사하고 다른 제안도 환영합니다! 만약 당신이 좋아하면, 위의 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; 

또는 : 모든 해답

4

간단한 질문 : 트리거를 사용 설정 했습니까?

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

편집 : 지금 당신이 OBJNRFICHIERS이 테이블 GEDFILES에서 null 인 것으로 설명 것을 보았다. 그 열에 0 (제로)을 넣고 시험을 ... 아마도 이것이 문제입니다! :)

+0

예. 이제 트리거를 활성화하고 "커밋"도 실행합니다. 지금 테스트를했는데 작동하지 않습니다. – RBA

+0

GEDDFILES 테이블에 행을 삽입 한 후 커밋하고 있습니까? –

+1

테이블 GEDFILES의 OBJNRFICHIERS 열에 값 0을 삽입 했습니까? –

2

이 코드를 조금 청소기를 만들기 위해 NVL2을 사용할 수있는 완벽한 장소입니다 +1 :

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

공유하고 즐기십시오 :

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

또는, 나는 가정, NVL은 단지뿐만 아니라 작동합니다.

+0

좋은 아이디어! 이 +1! – RBA

관련 문제