我在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引用到日志表中?
答案 0 :(得分:2)
使用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;
/