青云的oracle开发经验谈
做了很多年的oracle数据库开发,主要精力在pl/sql上,有些不成熟的经验想和大家分享, 有什么错误欢迎指正:daizhicun@126.com
要点:
1. PL/SQL的使用规范;
2. PL/SQL 的常用技巧和注意点 3. 项目中整理的技巧花絮; 4. ORACLE结构简述
5. ORACLE 数据库的安装使用说明;
1.PL/SQL的使用规范;
1.1对象命名规范
在mssql中,对象名可以大小写错开写,所以命名的时候比较方便,比如入库单号这个字段,可以用BillInNo,这样可读性还不错,可是到了oracle里,该方法就不灵了,因为Oracle不区分大小写,所以不可写成BILLINNO,这样可读性很差,建议写成BILL_IN_NO这样的格式;
当然如果非要区分大小写,也不是不可,我们可以加上””,比如”BillInNo”;但是这样做不推荐,因为访问该字段的时候,必须写成 select ”BillInNo”..,一个字也不能差,大小写一点不能错;
对于其他对象,表名,视图名,过程名,报名,触发器名…,也类似这种方法用“_”作为分割符的方法;
对于视图名,因为其调用方法和表名类似,所以最好对视图给给个前缀或后缀,否者写一个语句
SLEECT * FROM ABC ,你不知道这个ABC到底是表名还是视图名; 前缀或后缀名一般为v 或vw,有的大写有的小写;
我个人的喜欢是用后缀 ,比如 SELECT * FROM ABC_VW;为什么用后缀呢?
因为在检索视图的时候,很多时候都用首字母检索,如果用前缀,就不便于首字母检索了; 对于过程,函数,包 这3个实现业务逻辑的名字;
我建议不要使用前后缀,有的人习惯在所有的过程前加上PROC_,我觉得没必要,反而有点画蛇添足;
如果真的要加,那为了风格一致,所有对象都加前缀,表名是:TB_ABC,视图名是:VW_ABC,函数名是:
FUN_ABC;
因为其实在调用的时候, 其实都能区分的; 比如:
调用过程: Begin
BILL_IN_AUDI(P1 =>:P1,P2=>:P2); End;
调用函数:
Begin
: RESULT:= BILL_IN_AUDI(:P1,:P2); End;
调用包:
Begin
BILL_IN.AUDI(:P1,:P2);
End;
基本看到调用写法,就能区分不同的逻辑业务对象;
1.2备注的重要性
表,视图,字段都有备注属性,希望大家把备注都填完整了,这样便于别人迅速的了解含义,虽然借助其他文档,也可以查看表结构含义,但是很多时候由于表结构经常做“微调”,文档未必能及时同步更新,就算及时更新了文档,也未必及时的传到相关人手上,还有,有的人不喜欢看文档,所以最直接的方法,就是把这些对象的含义清楚明确的直接写在数据库对应的对象里;
还有一点,就是同一个字段,最好只有一个含义,这样可读性更好;
比如 BILL_NO ,一会儿是入库单号的意思,一会儿是盘点单号的意思,给开发人员带来很大的混淆;
为了检测同一个字段的含义是否一致,可以使用下面工具检查并修正:
对于视图,在sqlserver里,它是没有视图名和字段名备注的,所以对于视图的含义就必须用额外的文档保存,而oracle就这个优点,视图和表一视同仁,都有对象名和字段名备注(视图名和字段的备注好像很少人关注,甚有些人都不知道有这个功能,一些第三方工具也不是很关注); 所以希望大家千万要使用好对象备注,当然对于procedure,function,package 也要写好自己的备注;哪怕三言两语,让别人大概知道什么回事;
1.3 参数变量命名规范;
其实规范很多,无所谓那个最合理,但是有一点是需要重点区分的;
在存储过程里,参数和内部变量一定要使用不同的前缀;因为程序一旦复杂了,参数和内部变量名很容易“混淆”
有的人习惯使用字段类型的前缀作为前缀,我觉得该方法不够好; 原因是:
1. 字段类型太“细”了,一般我们看到变量基本就知道其类型;而且很多时候对类
型也不敏感; 2. 参数或内部变量不仅仅是字段类型,还有cursor,数组等,这些也需要有前缀,有
可能和字段类型的前缀冲突;
下面举一个例子显示其风格:
----------------------------------------------- --审核入库单
CREATE OR REPLACE PROCEDURE AUDI_BILL_IN (
p_bill_in_no bill_in_mt.bill_in_no%TYPE, p_crea_per_no bill_in_mt.crea_per_no%TYPE, p_code OUT PLS_INTEGER, p_msg OUT VARCHAR2 )
IS
v_cnt PLS_INTEGER;
v_bill_in_type bill_in_mt.bill_in_type%TYPE; ............
当然有点规范上,更严的的把参数做了区分,比如输入参数用i_前缀,输出参数用o_前缀,输入输出用io_前缀;
不过我个人习惯凡是参数都用P_前缀(parameter),凡是变量都用v_前缀(variable),这样最傻瓜化,不用动脑子;
还有一个关键的说明:
Pl/SQL中的参数其实是没有长度的,或者说就是最大长度,我们不能指定长度;
比如定义参数
p_msg OUT VARCHAR2 ; --不能定义成varchar2(200) ; 这里的 varchar2就相当于最大长度4000;
就算我们使用了%TYPE类型做为参数的定义,比如表abc一个字段字段 a varchar2(20); 定义参数
P_a abc.a%type; -- p_a 的真实类型其实还是varchar2(4000);
Oracle为什么设计,我想可能是为了简化开发,因为参数是对外输入输出接口,都以最大的长度设置,不容易出现数据溢出的问题,所以一定要留意这一点,这是和T-SQL不一样的地方;
当然,内部变量的定义还是需要指定长度的;
这里同时也引申了一个注意点,就是有时我们在前台定义调用存储过程或其它对象的参数长度的时候,千万不要“吝啬”,尽量的定义的大些,尽可能的和oracle保持一致;
1.4尽量使用%type作为参数和变量类型;
很多人一直写T-SQL的存储过程写惯了,没留意PL/SQL这么好的功能,建议一定要用; 比如 单号类型,在T-SQL里,只能定义成 v_bill_type varchar(20);
这样定义的缺点就是把类型“钉死”了;万一以后修改表结构,把bill_type的字段类型修改