Я пытаюсь обновить 2 поля в нескольких таблицах в моей базе данных, используя триггер после вставки новой строки - PullRequest
0 голосов
/ 15 января 2019

Я только что создал триггер

вот код:

CREATE OR REPLACE TRIGGER tr_update_solde_nbreserv
AFTER INSERT ON reservation
FOR EACH ROW
BEGIN
    UPDATE CLIENTS
    SET CLIENTS.NB_RESERV = NB_RESERV+1 , CLIENTS.SOLDE = SOLDE+1
    FROM dbo.clients as c
    INNER JOIN dbo.reservation as r
    ON c.numc = r.numc
    WHERE r.numr = :new.numr;

    BEGIN
        SELECT fillHist_station FROM DUAL;
    END;

end tr_update_solde_nbreserv;

я получаю эти 2 ошибки:

Ошибка (1,9): PL / SQL: оператор SQL игнорируется

Ошибка (3,9): PL / SQL: ORA-00933: команда SQL неправильно завершена

как я могу их исправить

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Есть несколько проблем с вашим кодом триггера.

1) Цель этой части кода неясна:

BEGIN
    SELECT fillHist_station FROM DUAL;
END;

fillHist_station не объявлено, следовательно, этот код вызовет ошибку invalid identifier.

2) Синтаксис запроса UPDATE недействителен. Кроме того, вы намерены выбрать из таблицы, с которой сработал триггер, что не разрешено в Oracle. Из вашего кода видно, что вам не нужно запрашивать RESERVATION для достижения своей цели. Поскольку строка была только что вставлена ​​в RESERVATION, вы уже знаете соответствующий номер клиента.

3) Вы пропускаете / в конце

Вот обновленная версия вашего кода, с которой вы можете поиграть в этой скрипте базы данных (вы не указали структуру ваших таблиц, поэтому я просто создал связи, на которые ссылаются в запросе ):

CREATE OR REPLACE TRIGGER tr_update_solde_nbreserv
AFTER INSERT ON RESERVATION
FOR EACH ROW
BEGIN 
    UPDATE CLIENTS
    SET NB_RESERV = NB_RESERV+1 , SOLDE = SOLDE+1
    WHERE numc = :new.numc; 
END tr_update_solde_nbreserv;
/
0 голосов
/ 15 января 2019
update CLIENTS
    SET CLIENTS.NB_RESERV = NB_RESERV+1 , CLIENTS.SOLDE = SOLDE+1
    FROM dbo.clients as c
    inner join dbo.reservation as r
        on c.numc = r.numc
        where r.numr = :new.numr;

обновление с внутренним объединением не поддерживается в базе данных Oracle таким образом. Более того, dbo.clients и dbo.reservations выглядят как таблицы Sql Server, а не как oracle.

Я верю, что вы ищете что-то подобное, но я не уверен в отношениях. Возможно, вам придется исправить запрос.

UPDATE 
(
   SELECT clients.nb_reserv, r.nb_reserv as r_nb_reserv, clients.solde, r.solde as r_solde 
   FROM clients
   inner join reservation as r
     on c.numc = r.numc
   where r.numr = :new.numr
) t
SET CLIENTS.NB_RESERV = r_nb_reserv + 1, clients.solde = r_solde+1;

Более простой подход

UPDATE clients SET NB_RESERV = (SELECT nb_reserv +1
                                  FROM reservations 
                                  WHERE c.numc = r.numc and r.numr = :new.numr),
    SOLDE = (SELECT SOLDE +1
                                  FROM reservations 
                                  WHERE c.numc = r.numc and r.numr = :new.numr)
WHERE  EXISTS (SELECT 1 FROM reservations 
     WHERE c.numc = r.numc and r.numr = :new.numr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...