2013-04-26 70 views
0

我正在嘗試創建一個觸發器,用於檢查每次創建新記錄時Tutor是否累積了15個小時的特定週期的輔導。桌子上的每個記錄等於一個小時。 15個特定教師的記錄意味着15個小時。我可以得到它來計算導師的所有記錄,但它應該根據插入函數插入的日期計算一週內的記錄。使用Next_Day功能的Sql觸發器

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子句,但是現在出現錯誤時嘗試將任何數據插入到表中。我在這裏做錯了什麼? code:where TutID =:new.TutID AND WorkWeek =(Select to_char(MeetDate,'YYYY IW')From Meeting Where MeetDate =:new.MeetDate); 錯誤:錯誤在第1行:ORA-01427:單行子查詢返回多個行 – 2013-04-29 23:36:11

+0

找出來。不知道Dual是我可以使用的默認表。再次感謝! – 2013-05-01 01:36:47

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;