【问题标题】:Creating trigger with 'instead of delete'使用“而不是删除”创建触发器
【发布时间】:2020-04-06 16:18:52
【问题描述】:

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

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

【问题讨论】:

  • 尝试删除end_date = SYSDATE周围的括号。
  • @Del 它不起作用
  • @Del 起初它不起作用,但这是因为我把表的名称弄错了,然后它起作用了。谢谢。

标签: oracle plsql database-trigger


【解决方案1】:

错误指向= 符号。你得到一个 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<>fiddle

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2015-06-05
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多