sql – 如何在触发器中引用自定义类型行

我在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;
/  
点赞