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分解, 就可算得被修改列的列表。
- ››oracle 中 UPDATE nowait 的使用方法
- ››Oracle ORA-12560解决方法
- ››Oracle 10g RAC 常用维护命令
- ››Oracle如何在ASM中定位文件的分布
- ››Oracle的DBMS_RANDOM.STRING 的用法
- ››oracle 外部表导入时间日期类型数据,多字段导入
- ››Oracle中查找重复记录
- ››oracle修改用户登录密码
- ››Oracle创建删除用户、角色、表空间、导入导出等命...
- ››Oracle中登陆时报ORA-28000: the account is lock...
- ››Oracle数据库在配置文件中更改最大连接数
- ››Oracle中在pl/sql developer修改表的两种方式
更多精彩
赞助商链接