简体   繁体   English

在触发器中调用存储过程? SQL

[英]Call a stored procedure in a trigger? SQL

CREATE OR REPLACE PROCEDURE TIME_CHECK
as

JOUR date;
HEURE date;
BEGIN

select to_char(sysdate, 'DAY'), to_char(sysdate,'HH.MI.SS')
into jour, heure
FROM DUAL   
WHERE JOUR = to_char(sysdate, 'DAY') AND HEURE = to_char(sysdate,'HH.MI.SS');

if (jour not between 'SUNDAY' AND 'FRIDAY') and (heure not between '08.00.00' AND '22.00.00')
or (jour !='SATURDAY') AND (HEURE NOT BETWEEN '08.00.00' AND '12.00.00')

then raise_application_error(-20111,'OUT OF BUSINESS HOURS');

end if; 

end;

-- TRIGGER - 扳机

CREATE OR REPLACE TRIGGER mod_job_history

before insert or update  on JOB_HISTORY

for each row

BEGIN

CALL TIME_CHECK 
---??????
        
END mod_job_history;

My procedure is supposed to valid if the user is trying to do something on business hours or not and the trigger is to be sure that the user is not allowed to insert or update the table job_history on business hours?如果用户尝试在营业时间做某事,我的程序应该有效,并且触发器是确保不允许用户在营业时间插入或更新表 job_history?

I've been working on it for several hours and I cannot find what's wrong help plz and how should I call my procedure via my trigger我已经工作了几个小时,但我找不到问题的帮助,我应该如何通过触发器调用我的程序

thank you谢谢你

Just use TIME_CHECK;只需使用TIME_CHECK; :

CREATE TRIGGER mod_job_history
before insert or update  on JOB_HISTORY
for each row
BEGIN
  TIME_CHECK;
END mod_job_history;
/

Also, your procedure will not work as intended as JOUR is initially set to NULL and the you are comparing against it in the WHERE clause.此外,您的程序将无法按预期工作,因为JOUR最初设置为NULL并且您在WHERE子句中与它进行比较。

You can use the procedure below (which will work regardless of which language you use):您可以使用以下过程(无论您使用哪种语言,该过程都有效):

CREATE PROCEDURE TIME_CHECK
AS
  day  PLS_INTEGER := TRUNC(SYSDATE) - TRUNC(SYSDATE, 'IW');
  time INTERVAL DAY TO SECOND := (SYSDATE - TRUNC(SYSDATE)) DAY TO SECOND;
BEGIN
  IF ( day IN (0, 1, 2, 3, 4) -- Monday to Friday
     AND time BETWEEN INTERVAL '8' HOUR
                  AND INTERVAL '22' HOUR
     )
     OR
     ( day = 5 -- Saturday
     AND time BETWEEN INTERVAL '08' HOUR
                  AND INTERVAL '12' HOUR
     )
  THEN
    -- Inside business hours
    NULL;
  ELSE
    raise_application_error(-20111,'OUT OF BUSINESS HOURS');
  END IF;
END;
/

db<>fiddle here db<> 在这里摆弄

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM