【问题标题】:How can I make trigger in Oracle SQL to change rows in another table如何在 Oracle SQL 中创建触发器以更改另一个表中的行
【发布时间】:2019-05-13 01:43:57
【问题描述】:

我需要在我的 SQL 代码中编写一个触发器,以更改表 A(Asortyment) 中的值,该表 A(Asortyment) 与表 B(Historia_Zamowien) 具有多对多关系。要连接 A 和 B,我使用表 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 

【问题讨论】:

  • des inserted 在您的查询中是什么意思?它与Historia_Zamowien 中新创建的行有关?
  • 我不是 100% 确定,但我希望它像你说的那样有效,因为我尝试了很多很多选项来使它有效,但没有一个有效,在这个之后我放弃了。跨度>

标签: sql oracle sql-insert database-trigger


【解决方案1】:

您的 SQL 存在几个问题:

  • 在 Oracle 中,您不能在 UPDATE 中使用 JOIN ;我将其替换为 WHERE EXISTS 相关子查询
  • 你在JOINs 和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
/

【讨论】:

  • 您的代码似乎运行良好,但我发现了另一个问题,我必须添加行Historia_Zamowien,然后将行添加到Zamowienia_Asortyment,然后将值更改为0,因为之前我在“空”表中搜索。不管怎样,你帮了我很多,谢谢你,祝你好运:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 2013-12-31
  • 1970-01-01
  • 2017-09-23
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多