WEB开发网
开发学院数据库Oracle Oracle中对COLUMNS_UPDATED()返回值解析 阅读

Oracle中对COLUMNS_UPDATED()返回值解析

 2007-06-15 12:33:29 来源:WEB开发网   
核心提示: 测试数据Update T_test Set f_datetime = getdate(),f_float = 0.0123, f_int= 1--上面Update 语句共修改了三个列--实际输出1.)1 f_int 0 12 f_int 0 12.)1 f_datetime May 15

测试数据

Update T_test Set f_datetime = getdate(),
f_float = 0.0123, f_int= 1
-- 上面Update 语句共修改了三个列
-- 实际输出
1.)
1 f_int 0 1
2 f_int 0 1
2.)
1 f_datetime May 15 2004 5:30PM May 15 2004 5:31PM
2 f_datetime May 15 2004 5:30PM May 15 2004 5:31PM
3.)
1 f_float 0 0.0123
2 f_float 0 0.0123

算法

COLUMNS_UPDATED()方法返回的 varbinary,是以每个小节存储8个字段(的修改状态)的方式记录了当前触发器所有列的修改情形。因此程序以8个字段为一片段来循环处理所有字段。

SET @iVal= SubString(COLUMNS_UPDATED(), @i + 1, 1)程序用上面语句将一小节转化为整型,测试发现:(当且谨当这一小片只有一个字段有修改时):

1,@iVal = 1 = 2^(1-1);
2,@iVal = 2 = 2^(2-1);
3,@iVal = 4 = 2^(3-1);
4,@iVal = 8 = 2^(4-11);
5,@iVal = 16 = 2^(5-1);
6,@iVal = 32 = 2^(6-1);
7,@iVal = 64 = 2^(7-1);
8,@iVal = 128 = 2^(8-1);

而当且谨当1,2个字段有修改时:

@iVal = 2^(1-1) + 2^(2-1) = 3;

而第 2,5,8 三个字段有修改时:

@iVal = 2^(2-1) + 2^(5-1) + 2^(8-1) = 146;
...

当8个字段都有修改时:

@iVal = 2^(1-1) + 2^(2-1) + ... + 2^(8-1) = 255;

也就是说 无论怎样修改,@iVal的值,不外乎是2^n - 1(n>0 and n <9, int)这一数组型成的[和组合](组合时每个数组成员最多出现一次)。因此反过来推算: 对 @iVal 按 2^n分解, 就可算得被修改列的列表。

上一页  1 2 3 

Tags:Oracle COLUMNS UPDATED

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接