タイムレコーダーをパンチする個人が過去5分以内にカードをパンチしたかどうかをテストすることになっているトリガーがあります。情報がない場合は、テーブルclk_dataに移動するために残しておく必要があります。そうでない場合は、ログテーブルutl_logbookにレコードを作成し、clk_dataへの挿入を中止する必要があります。
私が良いパンチを実行すると、インサートは宣伝どおりに機能します。パンチが悪い場合(最後のパンチから5分以内)、次のエラーが発生します。
SQL Error: ORA-20101: Too Soon
ORA-06512: at "TRUTRACK.INSERT_CLK_DATA", line 14
ORA-04088: error during execution of trigger 'TRUTRACK.INSERT_CLK_DATA'
トランザクションは停止しましたが、utl_logbookに記録されていません。
The trigger code:
create or replace
TRIGGER "INSERT_CLK_DATA"
BEFORE INSERT ON clk_data
FOR EACH row
BEGIN
DECLARE qty INTEGER := 0;
BEGIN
SELECT COUNT(*)
INTO qty
FROM clk_data
WHERE clk_time BETWEEN (:new.clk_time - 5/(24*60)) AND (:new.clk_time + 5/(24*60))
AND :new.payroll = clk_data.payroll;
IF qty > 0 THEN
INSERT INTO utl_logbook (time, source, message) VALUES (sysdate, 'INSERT_CLK_DATA', 'Clock punch within restricted window. Payroll ID:' || :new.payroll || ' Time: ' || :new.clk_time || ' Type: ' || :new.type);
RAISE_APPLICATION_ERROR(-20101, 'Too Soon');
END IF;
END;
END;