成number或是其他的,这就就不会自动“跟着更新”;
所以最好写成 v_bill_in_type bill_in_mt.bill_in_type%TYPE;
不过据说直接写类型,程序运行效率更好些,我想即使有效率损失,这么一点点也无所谓吧;
还有记录类型 %rowtype也是个很不错的东西,否者按字段定义,就要定义几十个变量才抵一个%rowtype;
以前在T-SQL里,没有这么好的东西,只能傻傻的一个一个字段变量定义,如今可以不用这么傻了;
1.5代码格式化
很多文章都详细描述了代码格式规范,我这里不再重叙述了,给大家一个最傻瓜话的一个方法,就是用工具,而且作为开发人员,一定要用工具格式化代码,不要在“代码排版”上花费任何无谓的时间;也许有的人认为自己很“牛叉”,自己手工做“排版”,要知道代码经常修修补补,每次都要在修补的地方做手工排排版,还是挺费“时间”的,而且分神,最糟糕的是,手工排版总可能有失误的地方,很难排的一丝一毫都不差;
排版工具推荐使用 pl/sql developer,如:
1.6用procedure 还是package
我个人更倾向于更多的使用package;这两个理论上并不冲突,不管习惯上应该有权重之分;
之所以有人很少或不用package,也许是被T-SQL害的,因为很多开发人员接触的第一个数据库都是mssql,没有接触过package;
我总结下来,package相对于procedure 有这几个优点:
a. 结构清晰,如果全部是过程,那么稍微复杂点的系统就会有数千个过程,感觉
很乱,如果用包,可以把相关业务合并,把数千个合并成数百个,结构清晰,查阅方便;
b. 命名方便,有点类似于java或C#里的namespace;特别是业务逻辑多了,没有分类,命名容易冲突
c. 功能更强些,比如如果输出cursor(在前台程序一般叫DataSet),用procudure好像是不能实现的,而且嵌入java等些高级应用,package也更容易点;
d. 对于很简单的相关业务点,用独立的过程感觉很浪费,比如我们做个设备跟踪
的操作,假如有十个点,每个点都做很少的操作,这样就要写10个过程,每个
过程就那么两三句话,这时候用package就非常合适,一个package里内嵌10个小过程,看上去比写10个独立的小过程更舒服些,关键可读性好多了,关联的业务点都放在一起了;容易维护;
e. 面向对象更好,可以做到overload等一些面向对象的特性;
f. 包加密方便,因为包分package和package body两部分,package 只是申明内部
函数或过程名已经全局变量;package body 实现具体函数或过程的脚本; 所以我们加密的时候只要对package body加密;package留给别人查阅,让他们清楚如何在前台程序里调用这些包里的函数和过程,这是“一箭双雕”的事情;
而在独立过程或函数上,就没法两者兼顾;oracle自己内部的包也都是这种模式;
g. 看看ORACLE自己,倾向于使用哪个,我们可以借鉴它的做法;
通过查看(11g的版本),发现sys用户的PROCEDURE, FUNCTION,PACKAGE的数
量分别为72,96,595(嵌入的过程或函数有10344个),包的逻辑对象数量占有98.4%;只有1%多的对象是独立的过程和函数; 所以我们应该参考
我曾经查看了一个朋友的ebs(oracle公司的erp产品,类似SAP)系统的数据库,其各种对象的分布是:
PACKAGE[18627]
PACKAGE BODY[18404] SYNONYM[16986] VIEW[13122] TRIGGER[1895] JAVA CLASS[1076] INDEX[519] TABLE[313] TYPE[196] SEQUENCE[58] JAVA RESOURCE[39] FUNCTION[16] QUEUE[8] TYPE BODY[5] PROCEDURE[4]
LOB[3]
其中package有1.8万多个,如果每个Package平均有10个procedure或function 那么将有18万左右的业务功能点;让我奇怪的是table少了,只有300多张,而view竟有1.8多个; 至于独立的procedure/function ,ebs机会没用。
1.7用varchar2 还是nvarchar2
其实varcahr2也分两种,varchar2(n) 和 varchar2(n char) ,后者在使用上和nvarchar2类似,都是支持Unicode,至于什么区别,我也不是很清楚;查看数据字典,能发现他们的不同,但是使用上好像没有明显的区别;
我个人更倾向于是使用varchar2类型,原因有两个:
1.7.1看oracle自身的使用“偏好”
当然varchar2里面也分varchar2(n) 和 vachar2(n char),我以前查过,好像varchar2(n
char)只有48;