2016-07-04 4 views
0

Я проклял триггер, который наблюдает за одним столом. Когда пользователь меняет столбец selected_selected на Y, я хочу, чтобы оракул поднимал столбцы из этой таблицы и вставлял их в таблицу поиска, в которой отслеживаются кандидаты, которые в настоящее время активны. I.e = '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. Cheers.

+0

И к какому сообщению об ошибке относится «ORA-04091»? Пожалуйста, поставьте полное сообщение об ошибке рядом с номером ошибки; мы не все гуляем по энциклопедиям номеров ошибок Oracle и их соответствующих сообщений об ошибках! * {:-) – Boneist

+1

Триггер уровня на 'tbl_candidates' обычно не разрешается запрашивать' tbl_candidates'. Не зная вашу модель данных, вам действительно нужно запрашивать 'tbl_candidates' или вы можете просто использовать данные, которые уже находятся в псевдозаписке': new'? –

+0

@JustinCave, но tbl_candidates в инструкции insert находится в другой схеме, где tbl_candidates включается триггер, предполагая, что OP не сделал опечатку в своем примере кода. – Boneist

ответ

0

Как было предложено Джастином Кейв, ваша проблема заключается в том, что вы выбираете ту же таблицу, к которой относится ваш триггер.

Если вам нужно, чтобы сохранить его в качестве вставки в качестве оператора выбора из-за необходимости иметь строку для каждого элемента в столбце АППАРАТУРЫ, то вы можете просто выбрать новые значения из двух, например, так:

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

Работает с удовольствием, спасибо всем за помощь. –

Смежные вопросы