创建一个与合并监视表的触发器

发布于 2025-01-26 20:12:04 字数 1153 浏览 4 评论 0 原文

我需要创建一个触发器来监视此表:

    CREATE TABLE "REFERENCE" 
   (    "NUM_CONTRACT" VARCHAR2(20 CHAR),  
    "NATURE" VARCHAR2(20 CHAR), 
    "PR" VARCHAR2(14 CHAR), 
   )

我只想将最后一个修改的日期存储在此表中:

CREATE TABLE EVENT_REFERENCE (
    ID NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) NOT NULL,
    reference VARCHAR(14) NOT NULL UNIQUE,
    date_modification TIMESTAMP(6),
    PRIMARY KEY (ID)
)

我使用合并来避免使用相同的参考和不同日期的重复行。我只想保留我创建此触发器的每个参考行的最后一个修改日期

,但是IDK有什么问题。谁能帮我吗?

CREATE OR REPLACE TRIGGER TRG_REFERENCE
    AFTER INSERT OR UPDATE ON REFERENCE
                               FOR EACH ROW
DECLARE
PRAGMA autonomous_transaction;
BEGIN
   IF INSERTING
   THEN
        MERGE INTO EVENT_REFERENCE hist
        USING (select :new.pr
               from   dual) t1
          ON (t1.pr=hist.reference)
        WHEN MATCHED THEN
          UPDATE SET hist.date_modification=systimestamp
        WHEN NOT MATCHED THEN
          INSERT INTO EVENT_REFERENCE (REFERENCE, DATE_MODIFICATION)
          VALUES (:NEW.prm, systimestamp);
   END IF;  
   COMMIT;
END;

I need to create a Trigger to monitor this table :

    CREATE TABLE "REFERENCE" 
   (    "NUM_CONTRACT" VARCHAR2(20 CHAR),  
    "NATURE" VARCHAR2(20 CHAR), 
    "PR" VARCHAR2(14 CHAR), 
   )

I just want to store the date of the last modification and his "PR" in this table :

CREATE TABLE EVENT_REFERENCE (
    ID NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) NOT NULL,
    reference VARCHAR(14) NOT NULL UNIQUE,
    date_modification TIMESTAMP(6),
    PRIMARY KEY (ID)
)

I use a merge in order to avoid to have duplicate rows with the same reference and different date . I just want to keep the date of last modification for each reference rows

For that i created this trigger but idk what's wrong with it . Can anyone help me ?

CREATE OR REPLACE TRIGGER TRG_REFERENCE
    AFTER INSERT OR UPDATE ON REFERENCE
                               FOR EACH ROW
DECLARE
PRAGMA autonomous_transaction;
BEGIN
   IF INSERTING
   THEN
        MERGE INTO EVENT_REFERENCE hist
        USING (select :new.pr
               from   dual) t1
          ON (t1.pr=hist.reference)
        WHEN MATCHED THEN
          UPDATE SET hist.date_modification=systimestamp
        WHEN NOT MATCHED THEN
          INSERT INTO EVENT_REFERENCE (REFERENCE, DATE_MODIFICATION)
          VALUES (:NEW.prm, systimestamp);
   END IF;  
   COMMIT;
END;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

顾北清歌寒 2025-02-02 20:12:04

您有:

  • :new.prm 应该是:new.pr
  • 插入event_reference(reference,date_modification)何时只需要 >插入(参考,date_modification)

您还使用插入或更新后,然后检查如果插入为什么不只是在插入之后不使用


固定的代码:

CREATE OR REPLACE TRIGGER TRG_REFERENCE
    AFTER INSERT OR UPDATE ON REFERENCE
                               FOR EACH ROW
DECLARE
PRAGMA autonomous_transaction;
BEGIN
   IF INSERTING
   THEN
        MERGE INTO EVENT_REFERENCE hist
        USING DUAL t1
          ON (:new.pr=hist.reference)
        WHEN MATCHED THEN
          UPDATE SET hist.date_modification=systimestamp
        WHEN NOT MATCHED THEN
          INSERT (REFERENCE, DATE_MODIFICATION)
          VALUES (:NEW.pr, systimestamp);
   END IF;  
   COMMIT;
END;
/

db<> fiddle

You have:

  • :NEW.prm when it should be :NEW.pr
  • INSERT INTO EVENT_REFERENCE (REFERENCE, DATE_MODIFICATION) when you just need INSERT (REFERENCE, DATE_MODIFICATION)

You also use AFTER INSERT OR UPDATE and then check IF INSERTING why not just use AFTER INSERT?


The fixed code:

CREATE OR REPLACE TRIGGER TRG_REFERENCE
    AFTER INSERT OR UPDATE ON REFERENCE
                               FOR EACH ROW
DECLARE
PRAGMA autonomous_transaction;
BEGIN
   IF INSERTING
   THEN
        MERGE INTO EVENT_REFERENCE hist
        USING DUAL t1
          ON (:new.pr=hist.reference)
        WHEN MATCHED THEN
          UPDATE SET hist.date_modification=systimestamp
        WHEN NOT MATCHED THEN
          INSERT (REFERENCE, DATE_MODIFICATION)
          VALUES (:NEW.pr, systimestamp);
   END IF;  
   COMMIT;
END;
/

db<>fiddle here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文