当前位置:首页 > 青云Oracle
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的字段类型修改
成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%多的对象是独立的过程和函数; 所以我们应该参考
共分享92篇相关文档