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

How to reference custom type row in trigger

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

和 tables:

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 上设置触发器,它会监视行的变化。以下部分有效,当我想将更改插入日志 table 时出现问题。插入 null 而不是引用有效,但尝试插入类似于 :newrow 或 ref(:newrow) 的内容不起作用。它抛出一个错误的绑定变量 (PLS-00049)。

所以问题是,我如何将新行引用到日志中 table?

使用 MAKE_REF 和 pseudo-column 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;
/