比如在ora_a数据库上:
table_aa.app_col number(4), table_ab.app_col char(3), table_ac.app_col varchar2(5), table_ad.app_col number, table_ae.app_col varchar2(4)
table_ba.app_col number, table_bb.app_col char(4), table_bc.app_col varchar2(6) ...
create table test ( id number primary key, name varchar2(32), address varchar2(32), phone varchar2(11) ); create or replace procedure proc_test (p_id in number) IS v_buf VARCHAR2(200); begin select name||\',\'||address||\',\'||phone into v_buf from test where id = p_id; /*其他的业务处理代码部分...*/ end; /
create or replace procedure proc_test (p_id in test.id%TYPE) IS v_buf VARCHAR2(200); begin select name||\',\'||address||\',\'||phone into v_buf from test where id = p_id; /*其他的业务处理代码部分...*/ end; /
现在将参数p_id的数据类型直接锁定在该表的列的数据类型上
每次编译过程时,PL/SQL都将从数据字典中查询该列的数据类型,并将其用于被编译的代码中
所以,如果真的将该列设定为字母数字型的,那么也不会对此代码造成任何伤害
对比上面的写法,是不是健壮了许多?
再看上面的一行硬编码 v_buf varchar2(200);
一般情况下,这个也不会导致什么问题,v_buf变量是一个用来存放导出数据的缓存
原来的test表结构中name,address,phone三个字段的最大长度加起来为75
所以我们给200 byte的长度是OK的了
突然某一天,客户又提需求了:我要求我的ID对应完整的联系信息,address要精确到门牌号码
很不幸,我们又得修改我们的表结构和代码了,是不是感觉很烦?
简单的我们直接重新声明v_buf为
v_buf varchar2(1000);
如果我的应用中有上百个类似的调整呢?修改100段代码的工作量是不是让你发疯?而且你都不能保证你的修改是否考虑周全
对于这种情况,Oracle提供了一个很好的解决方案:使用SUBTYPE
SUBTYPE是另一个已定义的数据类型的一个别名
例如,针对本案例,定义一个listbuffer_t的新数据类型,它其实就是VARCHAR2(1000)的另一个名字
CREATE OR REPLACE PACKAGE app_def AS SUBTYPE listbuffer_t IS VARCHAR2 (1000); END app_def;
有了这个SUBTYPE,可以将我的声明调整为:
v_buf app_def.listbuffer_t;
这样我就从proc_test过程的声明中去除了硬编码
如果大家在声明类似的变量时,都利用预定义的、应用程序特定的数据类型,如listbuffer_t
那么我们就可以错误点削减到代码中的一个位置,比如本案例中的app_def package中
调整起来是不是也很方便?如果1000字节还不够用,那么我只需要修改app_def中的这一行代码,并重新编译就OK了
是不是相对比较健壮呢?
修改后的解决方案:
SQL> create table test 2 ( id number primary key, 3 name varchar2(32), 4 address varchar2(32), 5 phone varchar2(11) 6 ); Table created SQL> SQL> CREATE OR REPLACE PACKAGE app_def AS 2 SUBTYPE listbuffer_t IS VARCHAR2 (1000); 3 END app_def; 4 / Package created SQL> create or replace procedure proc_test (p_id in test.id%TYPE) IS 2 v_buf app_def.listbuffer_t; 3 begin 4 select name||\',\'||address||\',\'||phone into v_buf from test where id = p_id; 5 /*其他的业务处理代码部分...*/ 6 end; 7 / Procedure created SQL>
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26515977/viewspace-1207955/ ,如需转载,请注明出处,否则将追究法律责任。