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

时间:2016-01-01 01:12:50

标签: sql oracle triggers sql-types

我在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引用到日志表中?

1 个答案:

答案 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;
/