SQL Server与Oracle对比:package
开发人员关注的数据库特性
作为一个开发人员而不是DBA我们对数据库关注的侧重点肯定不一样.我们不太需要知道备份,配置,优化,维护数据库.我们关注的是应用程序中需要的数据是怎么保存在数据库中的(被保存成一个个的表),以及怎么存储读取表中数据,表自然也是数据库最最重要的东东了.当然为了更好的操作表中的数据,保证数据的完整性.又衍生出些其他功能机制.比如trigger(触发器),function(函数),stored procedure(存储过程).实现这三个功能又需要用到扩展的sql语句. 另外还有啥view(视图),synonym(同义词).上面提到的这些东东就是开发人员关注的东东,当然如果要关注性能,想优化sql还得知道像啥执行计划,trace文件之类跟性能相关的一些东东.
Package的用处
function和stored procedure实际上就跟我们写代码中用到的一个个函数是一样的,只不过stored procedure是没有返回值的函数,相当前面带个void的函数.
在面向过程的
编程语言如C中,放眼望去是一堆堆的函数,如果数量一多显得有点杂乱无章.如果在面向对象的语言中就很好办,用个类可以把很多函数打包起来,oracle中有个叫package的东东,就类似于类,可以把很多function与stored procedure打包放一起. 但是sql server中没有package这东东.如果实在觉得function多了太乱了可以把某一类function放到某个schema下面,用schema来模拟下类似的功能.
Package的用法
在讲package前先讲下as与is的区别
在oracle的sql或pl/sql语句中经常会看到is和as这两关键字.有时随便用哪个都可以,有时却又不能混淆使用.
1.创建视图:只能用as
比如create view my_view as select * from tmp;此时如果用is会报错.
2.声明游标:只能用is
例如declare
cursor my_cur is
select * from tmp;
begin end;
3.as与is可以通用
在创建package,procedure,function时is与as可以通用,没有区别.
包头与包体
我们知道C++中有头文件与源文件这样的区分.package也类似,分为包头与包体,分开单独创建.
包头:是声明部分,不能有定义.有proedure与function,还有公共变量的声明.这里声明的procedure和function,变量相当于C++中用public标志的东东,外部都可以访问.
但变量只能package内部使用
包体:除了实现包头的声明外还可以另外创建一些procedure,function.但是它们只能在packeg内部使用了,不能被外部调用,相当于C++中private修饰的一样.当然包体也可以定义些公共变量,同样是只能package内部使用.
创建包头
create [or replace] package package_name
as
--procedure ,function declaration
end [package_name];
--中括号括起来的表示可选项replace表示如果有同名的对象则覆盖掉.
假如创建如下包头
create or replace package my_pkg
as
v_id integer := 888;
procedure do_something;
function get_id return integer;
end my_pkg;
创建包体
包体名字要跟包头一样.
create or replace package body my_pkg
as
function get_id return integer
as
begin
return v_id;
end get_id;
procedure do_something
as
begin
null;
end do_something;
end my_pkg;