如何在触发器中引用自定义类型行
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;
/
我在 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;
/