Как сделать триггер в Oracle SQL, чтобы изменить строки в другой таблице - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужно написать триггер в моем коде SQL, который изменяет значения в таблице A (Asortyment), которая связана с таблицей B (Historia_Zamowien) с отношением Many-Many.Для соединения A и BI используйте таблицу C (Zamowienia_Asortyment).

Как это выглядит в реляционной модели

Мне нужно добраться до Asortyment.Dostepnosc через Zamowienia_Asortyment послеINSERT ON Historia_Zamowien и измените значения на 0.Я написал код, который не работает, и я понятия не имею, что не так.Не могли бы вы помочь?

CREATE TRIGGER "Zmiana_Dostepnosci_Po_Zamowieniu"
AFTER INSERT ON "Historia_Zamowien"
FOR EACH ROW
BEGIN
    UPDATE "Asortyment"
    SET tab1."Dostepnosc" = 0
    FROM "Asortyment" tab1 JOIN "Zamowienia_Asortyment" tab2 ON tab1."ID_sprzetu" = tab2."ID_sprzetu"
         JOIN inserted tab3 ON tab2."Numer_zamowienia" = tab3."Numer_zamowienia"
    WHERE tab1."ID_sprzetu" = tab2."ID_sprzetu" AND tab2."Numer_zamowienia" = inserted."Numer_Zamowienia"
END;
/

После того, как я запустил код, я получил:

Error(1,5): PL/SQL: SQL Statement ignored
Error(3,5): PL/SQL: ORA-00933: SQL command not properly ended
Error(7): PLS-00103: Endountered symbol "end-of-file" when expecting one of the following:     ( begin case declare end exception exit for goto if loop mod    null pragma raise return select update while with    <an identifier> <a double-quoted delimited-identifier>    <a bind variable> << continue close current delete fetch lock    insert open rollback savepoint set sql execute commit forall    merge pipe purge json_exists json_value json_query    json_object json_array 

1 Ответ

0 голосов
/ 12 декабря 2018

Есть несколько проблем с вашим SQL:

  • в Oracle, вы не можете использовать JOIN в пределах UPDATE;Я заменил его коррелированным подзапросом WHERE EXISTS
  • , в котором вы повторили условия в JOIN s и WHERE, я упростил этот
  • для ссылки на вновь вставленную строку в Historia_Zamowien, используйте ключевое слово :NEW (кажется, вы используете inserted)

Попробуйте:

CREATE TRIGGER "Zmiana_Dostepnosci_Po_Zamowieniu"
AFTER INSERT ON "Historia_Zamowien"
FOR EACH ROW
BEGIN
    UPDATE "Asortyment" tab1 SET tab1."Dostepnosc" = 0
    WHERE EXISTS (
        SELECT 1
         FROM "Zamowienia_Asortyment" tab2 
         WHERE tab2."ID_sprzetu" = tab1."ID_sprzetu"
         AND tab2."Numer_zamowienia" = NEW."Numer_Zamowienia"
    )
END
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...