2013-04-26 2 views
0

새 레코드가 만들어 질 때마다 교사가 특정 주 동안 15 시간의 개인 학습을 누적했는지 확인하는 방아쇠를 만들려고합니다. 테이블의 각 레코드는 1 시간과 같습니다. 특정 교사를위한 15 건의 기록은 15 시간을 의미합니다. 교사를위한 모든 기록을 세는 데 사용할 수는 있지만 삽입 기능을 사용하여 삽입 한 날짜를 기준으로 일주일 내에 기록을 계산해야합니다.Sql 트리거 Next_Day 함수를 사용하여

Create or replace Trigger Tutor_15hr_Rule 
Before Insert on Meeting 
For each row 
Declare 
HoursWorked binary_integer; 
begin 
select count(TutID) 
into HoursWorked 
from Meeting 
where TutID = :new.TutID AND MeetDate Next_Day (:new.MeetDate, 'Saturday'); 
DBMS_OUTPUT.PUT_LINE(HoursWorked); 
if (HoursWorked + 1) > 15 then 
Raise_application_Error(-20002, 'exceeded no of hours'); 
end if; 
end; 
/
show error; 

약간의 빛을 비출 수있는 사람에게 미리 감사드립니다.

답변

0

다양한 형식 모델과 함께 to_char를 사용하여 다른 옵션과 함께 날짜를 연도와 주로 변환 할 수 있습니다.

SELECT to_char(CURRENT_DATE,'YYYY IW') FROM DUAL 

은 변환하기 전에 일을 추가 할 수 있습니다 일주일의 시작을 변경하려면 :

SELECT to_char(CURRENT_DATE + INTERVAL '2' DAY,'YYYY IW') FROM DUAL 
+0

응답 주셔서 감사합니다. 내 테이블에 'WorkWeek'속성을 추가하여 MeetDate 값을 기준으로 레코드가 속한 작업 주를 추적 한 다음 트리거에서 where 절에 대해 다음 코드를 시도했지만 지금은 오류가 발생합니다. 테이블에 데이터를 삽입하십시오. 여기서 내가 뭘 잘못하고 있니? 코드 : TutID = : new.TutID AND WorkWeek = (to_char (MeetDate, 'YYYY IW')를 선택하십시오. 여기서 MeetDate = : new.MeetDate); 오류 : 행 1의 오류 : ORA-01427 : 단일 행 부질의가 두 개 이상의 행을 반환합니다. –

+0

알아냅니다. 듀얼이 내가 사용할 수있는 기본 테이블이라는 것을 알지 못했습니다. 다시 한 번 감사드립니다! –

0

생각 나는 최종 코드를 공유하고자합니다. 완벽하게 작동합니다! (Brian 고마워!)

Create or replace Trigger Tutor_15hr_Rule 
Before Insert on Meeting 
For each row 
Declare 
HoursWorked binary_integer; 
begin 
select count(TutID) 
into HoursWorked 
from Meeting 
where TutID = :new.TutID AND WorkWeek = (Select to_char(:new.MeetDate, 'YYYY IW') From Dual); 
DBMS_OUTPUT.PUT_LINE(HoursWorked); 
if (HoursWorked + 1) > 15 then 
Raise_application_Error(-20002, 'exceeded no of hours'); 
end if; 
end; 
/
show error;