尝试访问语句触发器内的表值时,出现以下错误“必须声明 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 和触发器的新手,对如何解决这个问题一无所知。
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;
我认为你需要一个之前的触发器,并且应该针对每一行,所以如果你只有这个:
IF amount < 3 THEN
DBMS_OUTPUT.PUT_LINE('DANGER');
END IF;
该行将被插入,您也会收到消息,但我认为您不想插入该行,因此一种方式可能是这样的:
CREATE TABLE testTable(
id INT,
store INT,
amount NUMBER
);
set serveroutput on size unlimited
CREATE OR REPLACE TRIGGER test_trigger
BEFORE INSERT OR UPDATE ON testTable
FOR EACH ROW
/*DECLARE
myID INT;
myStore INT;*/
BEGIN
-- myID := :new.id;
-- myStore := :new.store;
IF :new.amount < 3 THEN
RAISE_APPLICATION_ERROR(-20001, 'Danger-Amount should be greater than or equal to 3');
END IF;
END;
/
我对声明部分进行了注释,因为变量没有被使用。
测试触发器:
INSERT INTO testTable (id, store, amount) VALUES (1, 101, 5); --this row will be inserted
INSERT INTO testTable (id, store, amount) VALUES (2, 102, 2); --this no
希望有帮助。