我在SQL中创建了2个自定义类型.第一个只是一个最小的类型,一个简洁的例子.
CREATE OR REPLACE TYPE TestType FORCE AS OBJECT
(
title VARCHAR(50)
);
/
第二种类型是第一种类型的日志.此类型用于记录第一种类型的更改.
CREATE OR REPLACE TYPE LogType FORCE AS OBJECT
(
title VARCHAR(50),
TestRef REF TestType
);
/
表格:
CREATE TABLE TestTable OF TestType;
CREATE TABLE LogTable OF LogType;
触发:
CREATE TRIGGER UpdateLog
BEFORE UPDATE OF title ON TestTable
REFERENCING new as newrow old as oldrow
FOR EACH ROW
WHEN (newrow.title != oldrow.title)
BEGIN
INSERT INTO LogTable VALUES(:oldrow.title, :newrow);
END UpdateLog;
/
现在,如前所述,我想在TestTable上触发,它会监视行的变化.以下部分有效,当我想将更改插入日志表时,会出现问题.插入null而不是引用工作,但尝试插入类似于:newrow或ref(:newrow)的东西不会这样做.它会抛出一个错误的绑定变量(PLS-00049).
所以问题是,我如何将newrow引用到日志表中?
最佳答案 使用MAKE_REF和伪列OBJECT_ID:
CREATE OR REPLACE TRIGGER UpdateLog
BEFORE UPDATE OF title ON TestTable
REFERENCING new as newrow old as oldrow
FOR EACH ROW
WHEN (newrow.title != oldrow.title)
BEGIN
INSERT INTO LogTable VALUES(:oldrow.title, make_ref(TestTable, :newrow.object_id));
END UpdateLog;
/