【问题标题】:Oracle statement trigger cant access table valuesOracle语句触发器无法访问表值
【发布时间】:2021-06-01 19:05:54
【问题描述】:

在我的语句触发器中尝试访问表值时,我收到以下错误“必须声明 ID XXX”。

表格

CREATE TABLE testTable(
   id INT,
   store INT,
   amount NUMBER
);

触发器

CREATE OR REPLACE TRIGGER test_trigger
    AFTER INSERT OR UPDATE ON testTable
    DECLARE
       myID INT;
       myStore INT;
    BEGIN
        myID := id;
        myStore := store;

      IF amount < 3 THEN
         DBMS_OUTPUT.PUT_LINE('DANGER');
      END IF;

    END;

错误

PLS-00201: ID 'id' must be declared
PLS-00201: ID 'store' must be declared
PLS-00201: ID 'amount' must be declared

我是 oracle pl/sql 和触发器的新手,对如何解决这个问题一无所知。

【问题讨论】:

  • 取决于您是要获取旧值还是新的价值。由于这是一个insert or update 触发器,我的假设是您希望插入的值以及update 语句将行更新到的值,因此您希望使用:new 伪记录。
  • @Andrew - 您可以通过将值分配给:new.xxx 标识符,为每个行触发器修改将要在之前插入/更新的行中的数据。这与在触发器主体中执行 update 语句不同。 This 可能是类似的。不过,这似乎不是这个问题的目的......
  • 如果您要更新表,而不是只更改正在修改的行,那么您不能使用行级触发器,也无法访问已更改的值。您可以创建一个复合触发器,其中包含将行级数据写入集合的行级部分和读取集合的语句级部分。但这是相当复杂的水平。您可能只需要一个修改被修改行的:new.amount 字段的行级触发器。
  • @Andrew - 您真的想根据插入/更新的一行的值将表中的 每一行 更新为 5 吗?这似乎不太可能。 if :new.amount &lt; 3 then :new.amount := 5; end if; 只会影响这一行。
  • @Andrew - 就像我说的,你需要一个 before 触发器,而不是一个 after 触发器。然后您可以更新新值。

标签: oracle plsql triggers


【解决方案1】:

needs :new 用于新记录或更新记录 试试这个。

CREATE OR REPLACE TRIGGER test_trigger
    AFTER INSERT OR UPDATE
    ON testTable
DECLARE
    myID      INT;
    myStore   INT;
BEGIN
    myID := :new.id;
    myStore := :new.store;
    IF :new.amount < 3
    THEN
        DBMS_OUTPUT.PUT_LINE ('DANGER');
    END IF;
END;


  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多