Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 语句触发器PL/SQL_Oracle_Plsql_Triggers - Fatal编程技术网

Oracle 语句触发器PL/SQL

Oracle 语句触发器PL/SQL,oracle,plsql,triggers,Oracle,Plsql,Triggers,我需要创建一个语句触发器,它只允许在办公时间更新PurchaseStock表中的数据。 PurchaseStock表为: 采购库存(库存ID、产品ID、数量单位、日期) 请注意,这里productId是一个外键 我知道如何为更新创建触发器,但我如何满足时间要求? 非常感谢您的帮助。假设您的办公时间在08:00到17:00之间,您可以在下面创建这样一个触发器,以防止在办公时间之外更新数据。您可以使用引发应用程序错误语句: CREATE OR REPLACE TRIGGER trg_upd_PrcS

我需要创建一个语句触发器,它只允许在办公时间更新PurchaseStock表中的数据。 PurchaseStock表为: 采购库存(库存ID、产品ID、数量单位、日期) 请注意,这里productId是一个外键

我知道如何为更新创建触发器,但我如何满足时间要求?
非常感谢您的帮助。

假设您的办公时间在08:00到17:00之间,您可以在下面创建这样一个触发器,以防止在办公时间之外更新数据。您可以使用
引发应用程序错误
语句:

CREATE OR REPLACE TRIGGER trg_upd_PrcStock
BEFORE UPDATE ON PurchaseStock 
FOR EACH ROW

DECLARE
   v_hour pls_integer;    
BEGIN
  select into v_hour extract(hour from cast(sysdate as timestamp)) from dual;

  IF v_hour between 8 and 16 THEN 
   -- trigger code    
  ELSE
   raise_application_error('-20333','You can not perform update out of office hours!');
  END IF;
END;

在这里,我住的地方,休息时间也是周六和周日(即周末),所以-我建议这样做:

SQL> create table purchase_stock (stock_id number, quantity number);

Table created.

SQL> create or replace trigger trg_biu_pursto
  2    before insert or update on purchase_stock
  3  declare
  4    -- day number (1 = Monday, 2 = Tuesday, ..., 7 = Sunday)
  5    l_day  number := to_number(to_char(sysdate, 'd'));
  6    -- current hour (e.g. now is 13:45 -> l_hour = 13)
  7    l_hour number := to_number(to_char(sysdate, 'hh24'));
  8  begin
  9    if l_day in (6, 7) or
 10       l_hour not between 9 and 17
 11    then
 12       raise_application_error(-20000, 'Non-working time; table not available');
 13    end if;
 14  end;
 15  /

Trigger created.

SQL> insert into purchase_stock values (1, 2);
insert into purchase_stock values (1, 2)
            *
ERROR at line 1:
ORA-20000: Non-working time; table not available
ORA-06512: at "SCOTT.TRG_BIU_PURSTO", line 10
ORA-04088: error during execution of trigger 'SCOTT.TRG_BIU_PURSTO'


SQL>

into hour
raise\u application\u error
中的开场白位于错误位置。此外,我个人认为错误消息中的感叹号样式不好。另外,您可以只声明
v_hour pls_integer:=extract(从systimestamp提取的小时数)
并保存一个
dual
@William Robertson的查询对不起,我的回答很匆忙。现在更正,感谢您的通知。明白!非常感谢:D工作得很好!