语句触发器 PL/SQL
Posted
技术标签:
【中文标题】语句触发器 PL/SQL【英文标题】:Statement Trigger PL/SQL 【发布时间】:2018-03-11 11:59:07 【问题描述】:我需要创建一个语句触发器,允许仅在办公时间更新 PurchaseStock 表中的数据。 PurchaseStock 表是: PurchaseStock(StockID、ProductID、QuantityIn、日期) 请注意,productId 在这里是一个外键。
我知道如何为更新创建触发器,但我如何满足这些时间的需求? 任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:在这里,我住的地方也是周六和周日(即周末)的休息时间,所以 - 我建议这样:
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>
【讨论】:
明白!非常感谢 :D 效果很好!【参考方案2】:假设您的办公时间在 08:00 到 17:00 之间,您可以在下面创建这样一个触发器,为了防止在办公时间以外更新数据,您可以使用 raise_application_error
语句:
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;
【讨论】:
into hour
和 raise_application_error
中的开场白放错了位置。另外我个人觉得错误信息中的感叹号风格很差。
你也可以声明v_hour pls_integer := extract(hour from systimestamp);
并保存dual
的查询。
@William Robertson 请原谅我的匆忙回复。现已更正,感谢您的通知。以上是关于语句触发器 PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 PL/SQL 触发器会引发“错误(2,2):PL/SQL:语句被忽略”和“错误(2,5):PLS-00204:函数或伪列'EXISTS'”错误?
Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器
为啥不允许在 PL/SQL 触发器中使用 ROLLBACK 语句,但 RAISE_APPLICATION_ERROR 是?