簡體   English   中英

在 PL/SQL 中觸發視圖

[英]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。

在此先感謝您的幫助。

你快到了。 這只是語法上的混亂。 您不能創建在插入、更新或刪除視圖BEFOREAFTER觸發的觸發器,但您可以創建觸發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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM