2013-01-07 4 views
0

전이 질문을 올렸습니다. 그러나 이제는 프로젝트 매니저가 돌아와 새로운 지침을 나에게주었습니다. 다시 말하지만, 나는 지금 조금 잃어 버렸고 그것을 연장하려고했습니다.선택 삽입으로 트리거 병합

나는 WHERE 논리를 사용하여 INSERT INTO가 필요한 트리거를 만들고 있습니다.

세 개의 테이블이 있습니다.

Absence_table :

----------------------------- 
| user_id | absence_reason | 
----------------------------- 
| 1234567 | 40   | 
| 1234567 | 50   | 
| 1213 | 40   | 
| 1314 | 20   | 
| 1111 | 20   | 
----------------------------- 

company_table :

----------------------------- 
| user_id | company_id  | 
----------------------------- 
| 1234567 | 10201   | 
| 1213  | 10200   | 
| 1314  | 10202   | 
| 1111  | 10200   | 
----------------------------- 

employment_table :

------------------------------------------- 
| user_id | emp_type | employee_id | 
------------------------------------------- 
| 1234567 | Int   | 1   | 
| 1213  | Int   | 2   | 
| 1314  | Int   | 3   | 
| 1111  | Ext   | 4   | 
------------------------------------------- 

그리고 마지막으로 내가 데이터를 진행해야하는 위치 테이블을에만 사람이 emp_type = Int 인에 employ_table 및 company_id = 10200

아웃 :

CREATE OR REPLACE TRIGGER "INOUT"."ABSENCE_TRIGGER" 
    AFTER INSERT ON arc_hrcs.absences_data 
    FOR EACH ROW 
DECLARE 
BEGIN 
    CASE 
     WHEN UPDATING THEN 
      MERGE INTO out o USING DUAL ON (out.user_id =:NEW.user_id) 
      WHEN MATCHED THEN UPDATE SET 
         out.employee_id = (SELECT employee_id FROM employment_table WHERE user_id = :NEW.user_id), 
         out.absence_reason = :NEW.absence_reason, 
         out.user_id = :NEW.user_id 
      WHEN NOT MATCHED THEN 


    insert into out (absence_reason, employee_id) 
select :NEW.absence_reason, e.employee_id 
    from employment_table e 
     inner join company_table c 
       on c.user_id = e.user_id 
where e.user_id = :NEW.user_id 
    and e.emp_type = 'INT' 
    and c.company_id = '10200'; 
    END CASE; 
END absence_trigger; 

내가 병합 구문에 따라 THEN MATCHED 코드하지 않을 경우 이후의 코드를 변경하는 방법을 알아낼 수 없습니다 : 여기

------------------------------------------- 
| employee_id | absence_reason | user_id | 
------------------------------------------- 
| 1   | 40   | 1234567 | 
| 1   | 50   | 1234567 | 
| 2   | 40   | 1213 | 
| 3   | 20   | 1314 | 
------------------------------------------- 

내 트리거입니다. 약간의 가이드가 나를 도울 것입니다 :-)

미리 감사드립니다.

+0

가 왜 사용자 1234567에 대한 두 개의 서로 다른 absence_reasons이 있습니까 :

나뿐만 병합을 다시 것? presence_table/out에서 동일한 사용자에 대해 두 개의 행을 갖는 것이 합리적입니까? –

답변

2

이전 답변이 너무 빠릅니다.

MERGE INTO out o USING (select e.employee_id, :NEW.user_id as user_id 
         from employment_table e 
         inner join company_table c 
          on c.user_id = e.user_id 
         where e.user_id = :NEW.user_id 
          and e.emp_type = 'INT' 
          and c.company_id = '10200') S 
ON (out.user_id =S.user_id) 
WHEN MATCHED THEN UPDATE SET 
    out.employee_id = s.employee_id, 
    out.absence_reason = :NEW.absence_reason, 
    out.user_id = :NEW.user_id 
WHEN NOT MATCHED THEN 
    insert (absence_reason, employee_id) 
    values (:NEW.absence_reason, S.employee_id); 
+0

마지막 두 줄 : INSERT (o.absence_reason, o.employee_id) VALUE (: NEW.absence_reason, S.employee_id)가 아니어야합니까? 내가 길을 가다 보면 "ORA-000926 VALUES 키워드가 누락되었습니다"라는 오류가 발생합니다. – Jaanna

+0

확실 해요, 당신 말이 맞아요. –

+0

thx, 저를 계속 보내야합니다 :-) – Jaanna

관련 문제