【发布时间】:2011-08-22 01:28:23
【问题描述】:
假设您在MY_CUSTOMER_TABLE 上有一个触发器,并且它有一个声明为MY_CUSTOMER_TABLE%ROWTYPE 类型的变量。如何将 OLD 值分配给该变量?
CREATE TRIGGER CUSTOMER_BEFORE
BEFORE UPDATE ON MY_CUSTOMER_TABLE
FOR EACH ROW
DECLARE
old_version MY_CUSTOMER_TABLE%ROWTYPE;
BEGIN
old_version := :OLD; /* Causes a PLS-00049 bad bind variable 'OLD' */
old_version := OLD; /* Causes a PLS-00201 identifier 'OLD' must be declared */
END;
编辑:
澄清一下,这是因为我使用触发器将行从MY_CUSTOMER_TABLE 归档到MY_CUSTOMER_TABLE_HISTORY。根据正在执行的操作(INSERT、UPDATE、DELETE),我需要来自OLD 或NEW 的所有字段:
CREATE TRIGGER CUSTOMER_BEFORE
BEFORE UPDATE ON MY_CUSTOMER_TABLE
FOR EACH ROW
DECLARE
historical_record MY_CUSTOMER_TABLE_HISTORY%ROWTYPE;
PROCEDURE
copy
(
source_record MY_CUSTOMER_TABLE%ROWTYPE,
destination_record IN OUT MY_CUSTOMER_TABLE_HISTORY%ROWTYPE
)
BEGIN
destination_record.customer_id := source_record.customer_id;
destination_record.first_name := source_record.first_name;
destination_record.last_name := source_record.last_name;
destination_record.date_of_birth := source_record.date_of_birth;
END;
BEGIN
/* I didn't want to replicate the same assignment statements for
each of the two cases: */
CASE
WHEN INSERT OR UPDATING THEN
copy( source_record => :NEW, destination_record => historical_record );
WHEN DELETING THEN
copy( source_record => :OLD, destination_record => historical_record );
END CASE;
/* Some other assignments to historical_record fields... */
INSERT INTO MY_CUSTOMER_TABLE_HISTORY VALUES historical_record;
END;
在这种情况下,PL/SQL 不允许我将 :OLD 或 :NEW 传递给需要 MY_CUSTOMER_TABLE%ROWTYPE 参数的过程。
【问题讨论】:
-
这不起作用,您需要明确指定所有列...我也希望这样做。