[英]Trigger on Views in PL/SQL
我想用 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。
在此先感謝您的幫助。
你快到了。 這只是語法上的混亂。 您不能創建在插入、更新或刪除視圖BEFORE
或AFTER
觸發的觸發器,但您可以創建觸發INSTEAD OF
插入、更新或刪除的觸發器:
插入或更新或刪除之前/之后的表 VIEW INSTEAD OF 插入或更新或刪除
並且,正如@Belayer 所寫,您不(也不應該)使用 SELECT,在插入或更新期間使用名為:new
的自動准備記錄作為新值,或者在更新期間使用記錄“:old”作為舊值或刪除。
您的觸發器看起來像:
CREATE OR REPLACE TRIGGER views_tr
INSTEAD OF INSERT OR UPDATE OR DELETE ON views
FOR EACH ROW
BEGIN
IF :new.x > :new.y THEN
UPDATE another_table SET D=' ', ... WHERE column1 = :new.x;
ELSE
dbms_output.put_line('ABC: ' || :new.x || ' < ' || 'CDE' || :new.y);
END IF;
END views_tr;
/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.