create or replace package body bbbbbbbbbbbbb is
-- Private type declarations
type is ;
-- Private constant declarations
constant := ;
-- Private variable declarations
;
-- Function and procedure implementations
function ( ) return is
;
begin
;
return();
end;
begin
-- Initialization
;
end bbbbbbbbbbbbb;
包说明和包体是1-0或1-1的关系。
若果只是申明变量plsql查看包里存储过程,不涉及到方式和储存过程,这么只有包说明就可以正确编译和使用。
假如在包说明中不仅定义变量还定义了其他的对象,像方式,储存过程。那就必须有包体,并在包体中实现定义的方式和储存过程。(这点和插口实现类很像,就是单承继和java插口不一样)。假如不实现,编译不报错,调用会报错。
包中对象的调用都是通过包名.变量名来调用。
到现今为止,包的益处和意义也应当清楚了。
首先,包的意义就是为了共享。这是一个编程很重要的问题。在java中,我们写一个类,
目的是为了调用。在其他地方,你可以直接new下来,就可以重复使用上面的方式,或则
这个类就是一种数据类型。这很容易理解。并且在plsql中我们申明一种自定义数据类型
(type),假如只在代码块的申明处定义,那就不能让其他对象共享。带来的问题就是假如返回结果是这种类型,如何让其他对象认识?
有了包,就促使plsql更像编程而不是简单的sql句子组合。
其次,包的结构类似java中的插口。这些设计的益处你可以觉得就是面向插口编程的用处。
(注意,包体中实现包说明中的定义时plsql查看包里存储过程,必须和申明一模一样!包括变量的名子!)
包说明:
create or replace package lsy_package is
--类型
type type_myrecord1 is record(
r_codecode lsy_codebook.codecode%type not null := 'i am default value',
r_codename lsy_codebook.codename%type,
r_result varchar2(32) default null,
r_flag number default 0);
--constant变量声明(必须赋值,类似java中final)
date_pattern_str constant varchar2(32) := 'yyyy-mm-dd hh24:mi:ss';
--变量声明
v_pub_yes varchar2(32) := 'yes';
myexception_package_one exception; --异常
procedure procc(ppp in number); --存储过程
function funcff(fff in number) return number; --方法
end lsy_package;
包体:
create or replace package body lsy_package is
-- 私有的类型type声明
type body_type is record(
r_one varchar2(32) not null := '',
r_two number);
-- 私有的constant变量声明
pub_body_true constant varchar2(32) := '1';
pub_body_false constant varchar2(32) := '0';
-- 私有的变量声明
v_now date := sysdate;
v_now_str varchar2(32);
-- 实现继承的方法和存储过程(也可以有私有的,那样只能在包体中使用,不能被调用)
procedure procc(ppp in number) is
rr number;
begin
rr := ppp + 1;
dbms_output.put_line('procc被调用:' || rr);
exception
when myexception_package_one then
raise_application_error(-20000,
'lsy_package中自定义异常:xxx!',
false);
when others then
raise;
end procc;
--
function funcff(fff in number) return number is
res number;
begin
res := fff + 1;
dbms_output.put_line('funcff被调用:' || res);
return res;
end;
begin
--在第一次调用时这个代码块只走一次
v_now_str := to_char(v_now, date_pattern_str);
dbms_output.put_line('初始化时间:' || v_now_str);
end lsy_package;
匿名代码块测试;
-- Created on 2013/7/11 by lsy
-- package测试1
declare
v_one lsy_package.type_myrecord1;
begin
v_one.r_codecode := 'qq';
v_one.r_codename :='ww';
v_one.r_result:='success!';
v_one.r_flag:=1;
dbms_output.put_line('v_one.r_codecode:' ||
v_one.r_codecode ||
',v_one.r_codename:' ||
v_one.r_codename||
',v_one.r_result:'||v_one.r_result||
',v_one.r_flag:'||v_one.r_flag);
dbms_output.put_line('lsy_package.date_pattern_str:' ||lsy_package.date_pattern_str );
dbms_output.put_line('lsy_package.v_pub_yes:' ||lsy_package.v_pub_yes );
dbms_output.put_line('lsy_package.funcff(3):' ||lsy_package.funcff(3) );
lsy_package.procc(1);
end;
/*打印
v_one.r_codecode:qq,v_one.r_codename:ww,v_one.r_result:success!,v_one.r_flag:1
lsy_package.date_pattern_str:yyyy-mm-dd hh24:mi:ss
lsy_package.v_pub_yes:yes
funcff被调用:4
lsy_package.funcff(3):4
procc被调用:2
*/
© 版权声明
本站下载的源码均来自公开网络收集转发二次开发而来,
若侵犯了您的合法权益,请来信通知我们1413333033@qq.com,
我们会及时删除,给您带来的不便,我们深表歉意。
下载用户仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,访问及下载者下载默认同意本站声明的免责申明,请合理使用切勿商用。
THE END
暂无评论内容