首页 > 解决方案 > 使用“而不是删除”创建触发器

问题描述

我想将删除语句视为更新,但它会引发此错误,我不知道它是什么意思。

create or replace trigger Miembros_V_IOD
   instead of delete on Miembros_V 
   for each row
Begin
   update Miembros set (end_date = sysdate)
   where Miembros.nick = :old.nick
   and Miembros.club = :old.club;
end;

LINE/COL ERROR
-------- ----------------------------------------------------------
2/4      PL/SQL: SQL Statement ignored
2/34     PL/SQL: ORA-00907: missing right parenthesis

标签: oracleplsqldatabase-trigger

解决方案


错误指向=标志。你得到一个 PL/SQL 错误——尽管是由内部 SQL 引起的——并且对于触发器,PL/SQL 错误中的行号从DECLARE(如果有的话)或开始BEGIN而不是从整个CREATE语句的开始。所以2/34指的是 PL/SQL 部分第二行的第 34 个字符,即:

   update Miembros set (end_date = sysdate)

...这是=.

你不应该有括号(end_date = sysdate)

create or replace trigger Miembros_V_IOD
instead of delete on Miembros_V 
for each row
begin
    update Miembros set end_date = sysdate
    where Miembros.nick = :old.nick
    and Miembros.club = :old.club;
end;
/

View MIEMBROS_V created.

db<>小提琴

文档中的语法图显示,括号可以围绕等号左侧的列列表,或围绕右侧的子查询;但不是围绕整个set条款。因为您set (end_date期望接下来有一个逗号或右括号,即set (end_date) = ...- 因此 ORA-00907 在它没有看到时被抛出。


推荐阅读