我正在尝试使用触发器将记录插入到与另一个表中更改的记录相同的表中。
我还需要插入操作是插入,更新还是删除
CREATE OR REPLACE TRIGGER triggername
AFTER INSERT OR UPDATE OR DELETE
ON tablename
DECLARE
operation_type VARCHAR2;
changed_id VARCHAR2;
BEGIN
IF UPDATING
THEN operation_type := 'Update';
ELSE IF INSERTING
THEN operation_type := 'Insert';
ELSE IF DELETING
THEN operation_type := 'Delete';
END IF;
SELECT id
FROM tablename
WHERE :OLD.record1 != :NEW.record1
OR :OLD.record2 != :NEW.record2
OR :OLD.record3 != :NEW.record3
OR :OLD.record4 != :NEW.record4
OR :OLD.record5 != :NEW.record5
OR :OLD.record6 != :NEW.record6;
INTO changed_id;
INSERT INTO trigger_table.id VALUES(changed_id);
INSERT INTO trigger_table.type VALUES(operation_type);
END;
/
我收到错误
“BAD BIND NAME:NEW”或“BAD BIND NAME:OLD”为每个:NEW或 :OLD
如上所示
答案 0 :(得分:1)
您的触发器代码存在多个问题:
您必须声明变量大小。否则你会收到错误
PLS-00215:字符串长度约束必须在范围(1 .. 32767)
中
例如,将其修改为:
operation_type VARCHAR2(20);
changed_id VARCHAR2(20);
SELECT id FROM tablename WHERE :OLD.record1 != :NEW.record1 OR :OLD.record2 != :NEW.record2 OR :OLD.record3 != :NEW.record3 OR :OLD.record4 != :NEW.record4 OR :OLD.record5 != :NEW.record5 OR :OLD.record6 != :NEW.record6; INTO changed_id;
语法不正确。 INTO 子句应位于 SELECT 和 FROM 子句之间:
SELECT id
INTO changed_id
FROM tablename
WHERE ...
这是关于错误绑定变量错误的原始问题。
要引用:OLD
和:NEW
值,您需要创建 ROW LEVEL Trigger ,其中必须包含以下条件:
FOR EACH ROW
INSERT INTO trigger_table.id VALUES(changed_id); INSERT INTO trigger_table.type VALUES(operation_type);
您必须插入一行而不是两行插入两个插入语句。此外,trigger_table.id
语法不正确。您需要在括号内提及列名称。
例如,
INSERT INTO trigger_table(column1, column2) VALUES
(changed_id, operation_type);
答案 1 :(得分:0)
当您尝试使用时:NEW表示删除,并且:OLD表示创建触发器,您会看到这些错误。
最好移动选择&在
中插入语句IF INSERTING THEN ... END IF;
IF UPDATING THEN ... END IF;
IF DELETING THEN ... END IF;
使用:NEW和:OLD变量