2016-07-04 3 views
0

나는 하나의 테이블을 감시하는 방아쇠를 세웠다. 사용자가 candidate_selected 열을 Y로 변경하면 oracle이 해당 테이블에서 열을 올리고 현재 활성 인 후보 즉 Y를 추적하는 조회 테이블에 삽입합니다. 열을 업데이트하려고하면 ORA-04091 오류가 발생합니다. 트리거는 테이블이 작성된 테이블을 변경하지 않으며 왜이 오류가 발생하는지 막혔습니다. 어떤 도움도 대단히 감사하겠습니다 - 나는 몇 사이트에왔다 및 수정 프로그램을 볼 수 없습니다,오라클 트리거 ORA-04091

CREATE OR REPLACE TRIGGER DEMO_SCHEMA.TRG_CANDIDATE_SELECTED 
AFTER UPDATE OF CANDIDATE_SELECTED ON DEMO_SCHEMA.TBL_CANDIDATES FOR EACH ROW 
BEGIN 

    IF :NEW.CANDIDATE_SELECTED = 'Y' THEN 

     INSERT INTO DEMO_SCHEMA.TBL_CANDIDATES_LKP 
      (UPDATED_DT, GROUP_ID, CAND_ID 
      ,STAGE, STEP, EQUIPMENT, ORDER_REQ 
      ,INCLUDED_IN_STUDY) 
     SELECT SYSDATE, GROUP_ID, CAND_ID, STAGE 
        ,STEP, TRIM(REGEXP_SUBSTR(EQUIPMENT, '[^,]+', 1, LEVEL)) EQUIPMENT 
        ,(CASE WHEN UPPER(ORDER_REQ) = 'FALSE' THEN 1 
           ELSE ROW_NUMBER() OVER (PARTITION BY GROUP_ID, CAND_ID, STAGE, STEP ORDER BY CAND_ID) 
         END) ORDER_REQ, INCLUDED_IN_STUDY 
     FROM (
      SELECT GROUP_ID, CAND_ID 
         ,STAGE, STEP, EQUIPMENT, EQUIPMENT EQUIP 
         ,ORDER_REQ, INCLUDED_IN_STUDY 
      FROM DEMO_SCHEMA.TBL_CANDIDATES 
      WHERE GROUP_ID = :NEW.GROUP_ID 
      AND LOT_ID = :NEW.CAND_ID 
      AND STAGE = :NEW.STAGE 
      AND STEP = :NEW.STEP 
      )  
     CONNECT BY LEVEL <= REGEXP_COUNT(EQUIP,', ')+1; 

    ElSIF :NEW.CANDIDATE_SELECTED = 'N' THEN 

     UPDATE DEMO_SCHEMA.TBL_CANDIDATE_LKP 
     SET INCLUDED_IN_STUDY = :NEW.CANDIDATE_SELECTED 
     WHERE GROUP_ID = :NEW.GROUP_ID 
     AND CAND_ID = :NEW.CAND_ID 
     AND STAGE = :NEW.STAGE 
     AND STEP = :NEW.STEP; 

    END IF; 

END TRG_CANDIDATE_SELECTED; 
/

에 구문 오류가있을 수 있습니다 내가 너무 오래 :) 그것을 쳐다 봤는데 생각 그러나 그것이 내가 게시하기 전에 내가 몇 가지를 바꿔야했기 때문입니다. 이 코드는 Oracle에서 컴파일됩니다. 건배.

+0

"ORA-04091"이라는 오류 메시지는 무엇입니까? 오류 번호 옆에 전체 오류 메시지를 제공하십시오. 우리는 오라클 오류 번호와 그에 상응하는 오류 메시지를 모두 걷는 백과 사전이 아닙니다! * {:-) – Boneist

+1

'tbl_candidates'의 행 레벨 트리거는 일반적으로 'tbl_candidates'를 쿼리 할 수 ​​없습니다. 데이터 모델을 알지 못하면'tbl_candidates'를 정말로 쿼리해야합니까, 아니면': new' 의사 레코드에 이미있는 데이터를 사용할 수 있습니까? –

+0

@JustinCave하지만 insert 문에서 tbl_candidates는 OP가 해당 예제 코드에서 오타를 입력하지 않았다고 가정 할 때 트리거가 켜져있는 tbl_candidates와 다른 스키마에 있습니다. – Boneist

답변

0

저스틴 케이브 (Justin Cave)의 제안에 따르면 트리거가 속한 테이블과 동일한 테이블에서 선택한다는 것이 문제입니다. 이 때문에 기기의 열에서 항목 당 행을 필요로 select 문으로 인서트로 유지해야하는 경우

, 당신은 너무 좋아, 이중에서 새 값을 선택할 수 있습니다

CREATE OR REPLACE TRIGGER DEMO_SCHEMA.TRG_CANDIDATE_SELECTED 
AFTER UPDATE OF CANDIDATE_SELECTED ON DEMO_SCHEMA.TBL_CANDIDATES FOR EACH ROW 
BEGIN 

    IF :NEW.CANDIDATE_SELECTED = 'Y' THEN 

     INSERT INTO DEMO_SCHEMA.TBL_CANDIDATES_LKP 
      (UPDATED_DT, GROUP_ID, CAND_ID 
      ,STAGE, STEP, EQUIPMENT, ORDER_REQ 
      ,INCLUDED_IN_STUDY) 
     SELECT SYSDATE, GROUP_ID, CAND_ID, STAGE 
        ,STEP, TRIM(REGEXP_SUBSTR(EQUIPMENT, '[^,]+', 1, LEVEL)) EQUIPMENT 
        ,(CASE WHEN UPPER(ORDER_REQ) = 'FALSE' THEN 1 
           ELSE ROW_NUMBER() OVER (PARTITION BY GROUP_ID, CAND_ID, STAGE, STEP ORDER BY CAND_ID) 
         END) ORDER_REQ, INCLUDED_IN_STUDY 
     FROM (
      SELECT :NEW.GROUP_ID group_id, 
        :NEW.CAND_ID cand_id, 
        :NEW.STAGE stage, 
        :NEW.STEP step, 
        :NEW.EQUIPMENT equipment, 
        :NEW.EQUIPMENT EQUIP, 
        :NEW.ORDER_REQ order_req, 
        :NEW.INCLUDED_IN_STUDY included_in_study 
      FROM dual 
      )  
     CONNECT BY LEVEL <= REGEXP_COUNT(EQUIP,', ')+1; 

    ElSIF :NEW.CANDIDATE_SELECTED = 'N' THEN 

     UPDATE DEMO_SCHEMA.TBL_CANDIDATE_LKP 
     SET INCLUDED_IN_STUDY = :NEW.CANDIDATE_SELECTED 
     WHERE GROUP_ID = :NEW.GROUP_ID 
     AND CAND_ID = :NEW.CAND_ID 
     AND STAGE = :NEW.STAGE 
     AND STEP = :NEW.STEP; 

    END IF; 

END TRG_CANDIDATE_SELECTED; 
/
+0

대단히 고마워요 .- 가야 겠어요. –

+0

도움을 주신 모든 분들께 감사드립니다. –