【发布时间】:2020-10-01 04:15:48
【问题描述】:
我想在 PL/SQL 中编写一个触发器。我的第一个目标是比较两种 time_stamp 数据类型(A 和 B)。如果其中一个大于另一个,例如 A>B,我将更新另一个表上的列。我尝试编写的触发器如下所示。
CREATE OR REPLACE TRIGGER trigger_name
AFTER INSERT OR UPDATE OR DELETE ON views
FOR EACH ROW
DECLARE
A views.X%TYPE;
B views.Y%TYPE;
C views.Z%TYPE;
BEGIN
SELECT X, Y, Z INTO A, B, C FROM views;
IF A>B THEN
update another_table set D=' ' and E='UNRESOLVED' where column1=A;
ELSE
dbms_output.put_line('ABC: ' || A || ' < ' || 'CDE' || B);
END IF;
END;
如果我执行此触发器,我会收到如下错误。
错误报告: ORA-25001: kan inte skapa den här triggertypen i den här typen av vy 25001. 00000 - “无法在视图上创建此触发器类型” *原因:只能在视图上创建 INSTEAD OF 触发器。 *操作:将触发器类型更改为 INSTEAD OF。
提前感谢您的帮助。
【问题讨论】:
-
错误很明显:您只能在视图上定义 INSTEAD OF 触发器。 AFTER INSERT OR UPDATE OR DELETE 触发器只能在表上创建(参见文档docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm)
-
因为错误消息清楚地指出您不能在视图上使用标准触发器。您必须使用 INSTEAD OF 触发器。见Documentation。此外,您不需要选择,而是使用 :new.x、:new.y、:new.z。因为您的选择将尝试检索视图中的每一行。这将导致“Too Many Rows 异常”。
标签: sql oracle plsql view triggers