Создание триггера с «вместо удаления» - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу рассматривать оператор удаления как обновление, но он выдает эту ошибку, и я не знаю, что это значит.

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

1 Ответ

2 голосов
/ 06 апреля 2020

Ошибка указывает на знак =. Вы получаете ошибку PL / SQL - хотя и вызванную внутренним SQL - и для триггера номера строк в ошибках PL / SQL начинаются с DECLARE (если есть) или BEGIN, не с начала общей инструкции CREATE. Таким образом, 2/34 относится к символу 34 второй строки части PL / SQL, который:

   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

Синтаксическая диаграмма в документации показывает что круглые скобки могут go располагаться вокруг списка столбцов слева от знака равенства или вокруг подзапроса справа; но не вокруг всей статьи set. Поскольку у вас есть set (end_date, он ожидает, что после него будет запятая или закрывающая скобка, то есть set (end_date) = ... - следовательно, ORA-00907 выбрасывается, когда он этого не видит.

...