Oracle语句触发器无法访问表值

问题描述 投票:0回答:2

尝试访问语句触发器内的表值时,出现以下错误“必须声明 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 和触发器的新手,对如何解决这个问题一无所知。

oracle plsql triggers
2个回答
0
投票

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;


  

0
投票

我认为你需要一个之前的触发器,并且应该针对每一行,所以如果你只有这个:

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

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.