Oracle PLS-00049:绑定变量触发器错误
我正试着让这个扳机工作。它所做的是,在从一个表及其附属表中删除数据之前执行,然后将删除的数据插入2个表中(我将其命名为tb1_arch和tb2_arch)。我一直在谷歌上搜索可能的修复程序,但我真的不知道如何让它工作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
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;