Oracle PLS-00049:绑定变量触发器错误

Oracle PLS-00049:绑定变量触发器错误,oracle,plsql,Oracle,Plsql,我正试着让这个扳机工作。它所做的是,在从一个表及其附属表中删除数据之前执行,然后将删除的数据插入2个表中(我将其命名为tb1_arch和tb2_arch)。我一直在谷歌上搜索可能的修复程序,但我真的不知道如何让它工作 CREATE OR REPLACE TRIGGER trig BEFORE DELETE ON tb1 FOR EACH ROW FETCH INSERT INTO tb1_arch VALUES (:old.OrderNum, :old.tb1Date,:old.Customer

我正试着让这个扳机工作。它所做的是,在从一个表及其附属表中删除数据之前执行,然后将删除的数据插入2个表中(我将其命名为tb1_arch和tb2_arch)。我一直在谷歌上搜索可能的修复程序,但我真的不知道如何让它工作

CREATE OR REPLACE TRIGGER trig
BEFORE DELETE ON tb1 FOR EACH ROW
FETCH
INSERT INTO tb1_arch VALUES (:old.OrderNum, :old.tb1Date,:old.CustomerName);
DBMS_OUTPUT.PUT_LINE('Data archived.');
END;
触发器是在上面创建的。但是当我添加这一行时

INSERT INTO tb2_arch VALUES (:old.OrderNum, :old.ItemNum, :old.Pieces);
在将
插入tb1\u arch值之后,它会给我一个错误

“第5行错误:PLS-00049:绑定变量'OLD.PIECES'错误”

任何帮助都将不胜感激

编辑:按照Vijayakumar先生的建议,我做了以下工作:

然而,我仍然有同样的错误

编辑:删除获取,我仍然遇到同样的问题

下表如下: tb1:

tb2


关键字
FETCH
应该是造成这种情况的原因,用
BEGIN
替换它,这是正确的语法

CREATE OR REPLACE TRIGGER trig
BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN
INSERT INTO tb1 VALUES (:old.OrderNum, :old.Date,:old.CustomerName);
INSERT INTO tb2_arch VALUES (:old.OrderNum, :old.ItemNum, :old.Pieces);
DBMS_OUTPUT.PUT_LINE('Data archived.');
END;
编辑:使用
OLD
引用的列名可能无效,这就是此错误的原因

触发器将仅适用于一个表的插入/更新/删除事件。不过,您可以在正文中引用多个表

但是
OLD
NEW
将始终引用您在DDL中提到的表,如tb1上的
DELETE

下面修改的代码将帮助您

CREATE OR REPLACE TRIGGER trig
BEFORE DELETE ON tb1 FOR EACH ROW
DECLARE
   v_ItemNum tb2.ItemNum%TYPE;
   v_Pieces tb2.Pieces%TYPE;
BEGIN
   INSERT INTO tb1_arch VALUES (:old.OrderNum, :old.Date,:old.CustomerName);

   /* Select the values for this item from table 2 */
   SELECT ItemNum,Pieces
    INTO v_ItemNum,v_Pieces
   FROM tb2
    WHERE OrderNum = :old.OrderNum;

   /* Insert the selected values in the table2's archive version */
   INSERT INTO tb2_arch VALUES (:old.OrderNum, v_ItemNum, v_Pieces);

   /* Delete the entry */
   DELETE from tb2 WHERE OrderNum = :old.OrderNum;

   DBMS_OUTPUT.PUT_LINE('Data archived.');
END;

或者,您可以在表2上为删除设置另一个触发器
,并将数据存档。

您应该添加引用
引用旧为旧
Hi!非常感谢您的回复!我在tb_1上执行了以下创建或替换触发器trig-BEFORE DELETE操作,引用每行的OLD AS OLD,但是,我仍然有相同的错误!你好,非常感谢你回复我的帖子!我照你说的做了,我仍然有同样的问题。是的,那是我的错,不应该有回音。我第一次尝试用光标解决这个问题,但没有成功。否则,列名
parties
应该无效。你能描述一下这张表吗?我将把它添加到帖子里,这样你就可以更容易地阅读了,哈哈,所以列
parties
不存在了?您使用
OLD
?它在tb1上不存在。tb2中存在“件”列。我的代码有一个输入错误,应该是tb1而不是tb_1(仍然是相同的错误)。
create table tb1 (
    OrderNum integer NOT NULL primary key,
    tb1Date date NOT NULL,
    CustomerName varchar2(50) NOT NULL,

--constraints
    CONSTRAINT tb1_uc unique (CustomerName)
);  
create table tb2 (
    OrderNum integer NOT NULL,
    ItemNum integer NOT NULL,
    Pieces integer NOT NULL,

--constraints
    CONSTRAINT tb2_fk foreign key (OrderNum) references tb1(OrderNum),
);
CREATE OR REPLACE TRIGGER trig
BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN
INSERT INTO tb1 VALUES (:old.OrderNum, :old.Date,:old.CustomerName);
INSERT INTO tb2_arch VALUES (:old.OrderNum, :old.ItemNum, :old.Pieces);
DBMS_OUTPUT.PUT_LINE('Data archived.');
END;
CREATE OR REPLACE TRIGGER trig
BEFORE DELETE ON tb1 FOR EACH ROW
DECLARE
   v_ItemNum tb2.ItemNum%TYPE;
   v_Pieces tb2.Pieces%TYPE;
BEGIN
   INSERT INTO tb1_arch VALUES (:old.OrderNum, :old.Date,:old.CustomerName);

   /* Select the values for this item from table 2 */
   SELECT ItemNum,Pieces
    INTO v_ItemNum,v_Pieces
   FROM tb2
    WHERE OrderNum = :old.OrderNum;

   /* Insert the selected values in the table2's archive version */
   INSERT INTO tb2_arch VALUES (:old.OrderNum, v_ItemNum, v_Pieces);

   /* Delete the entry */
   DELETE from tb2 WHERE OrderNum = :old.OrderNum;

   DBMS_OUTPUT.PUT_LINE('Data archived.');
END;