如何在 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
相关子查询 替换了它
- 您在
JOIN
和 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
/
我需要在我的 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
相关子查询 替换了它
- 您在
JOIN
和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
/