一、问题提出
这个问题是由于我们的ac04表结构发生变化想到的。
由于新的征缴政策的实行,使得单位缴费基数和个人缴费基数发生了变化。所以ac04表扩充了5个字段,但我们的程序改动量不大。这是因为程序中使用到了变量锚定。
二、关于锚定
所谓变量锚定,就是在定义和 表、表字段 相关的变量的时候,该变量的类型不是定义为varchar2,number,date....等类型,而是和 表/字段 锚定上。
通过使用如下方法进行锚定:
%rowtype --表锚定(记录)
%type --字段锚定
三、举例
1.表锚定
我们需要从ac04中取出某人员某条记录,保存到rec_ac04中,然后进行相应处理。对于rec_ac04的类型定义,有很多种方法:
(1)锚定
rec_ac04 ac04%rowtype;
(2)记录
type record_ac04 is record(
--多个变量,类型与ac04的各个字段类型一致
...
);
rec_ac04 record_ac04;
(3)游标锚定
cursor cursor_ac04 is
select * from ac04 where <where_case>;
rec_ac04 cursor_ac04%rowtype;
...(应该还有其他的方法,欢迎大家补充)
表锚定的好处就是:如果ac04表发生了变化,不需要修改相应程序。因为是使用%rowtype定义的变量,该变量是个记录,其结构自动与表ac04匹配。
所以我们推荐使用方法1;
而方法2在表结构发生变化后,需要修改相应的程序;
方法3也是锚定,不过要是游标的定义发生了变化,那变量rec_ac04的定义可能也会变化(比如游标cursor_ac04中的查询语句变成select aac001 from ac04)。
2.字段锚定
跟表锚定的原理是一样的,不过使用的定义方法是%type。
表ac04中有一个字段是bic001,存储单位养老保险缴费基数,其定义为number(10,2)。
我们在程序中可以定义相应的变量:
n_bic001 number(10,2);
或
n_bic001 ac04.bic001%type;
都没有问题。但如果有一天,该精度不够了,需要修改ac04.bic001为number(12,2)类型,那使用第一种方法定义的变量,就需要修改了;而使用第二种方法定义的变量则不需要修改。
四、总结
变量锚定使用起来更方便,而且有利于程序的健壮性和可维护性,推荐使用。
