【发布时间】: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 < 3 then :new.amount := 5; end if;只会影响这一行。 -
@Andrew - 就像我说的,你需要一个 before 触发器,而不是一个 after 触发器。然后您可以更新新值。