如何在 Oracle SQL 中创建触发器以更改另一个 table 中的行

How can I make trigger in Oracle SQL to change rows in another table

我需要在我的 SQL 代码中编写一个触发器来更改与 table B(Historia_Zamowien) 连接的 table A(Asortyment) 中的值关系多对多。要连接 A 和 B,我使用 table C(Zamowienia_Asortyment).

How it looks like in relational model

我需要在 INSERT ON Historia_Zamowien 之后通过 Zamowienia_Asortyment 到达 Asortyment.Dostepnosc,并将值更改为 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 

您的 SQL 有几个问题:

  • 在 Oracle 中,您不能在 UPDATE 中使用 JOIN;我用 WHERE EXISTS 相关子查询
  • 替换了它
  • 您在 JOINWHERE 子句中重复了条件,我简化了
  • 引用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
/