使用 'instead of delete' 创建触发器

Creating trigger with 'instead of delete'

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

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

错误指向 = 符号。您收到了一个 PL/SQL 错误 - 尽管是由内部 SQL 引起的 - 对于触发器,PL/SQL 错误中的行号从 DECLARE 开始(如果您有one) 或 BEGINnot 从整个 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<>fiddle

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