设为首页 收藏本站
查看: 688|回复: 0

[经验分享] Oracle PL/SQL 包的使用

[复制链接]

尚未签到

发表于 2016-8-12 06:00:11 | 显示全部楼层 |阅读模式
SQL> set serveroutput on;
SQL> remark 包:是由存储在一起的相关对象组成的PL SQL结构。包有两个独立的部分:即说明部分和包体,这两个部分是独立的存在数据字典中的;
SQL> remark 包的说明:包的说明包含了有关包的相关信息。该部分中不包含包的代码部分;

SQL> edit;
Wrote file afiedt.buf

  1  create or replace package testpak
  2  is
  3  procedure mysub(a int);
  4  function myfunc(b int) return int;
  5* end testpak;
SQL> /

Package created.

SQL> remark 包体:是一个独立于包头的数据字典对象。包体只能在包头完成编译后进行编译。包体中带有包头中描述的前向子程序代码段;
SQL> remark 注:包体是可选的;包头和包体中的过程和函数必须一致,包括子程序名和其参数名,以及参数模式。
SQL> create or replace package body testpak
  2  as
  3  procedure mysub(a int)
  4  is
  5  begin
  6  dbms_output.put_line(a*a);
  7  end mysub;
  8  
  9  function myfunc(b int) return int
10  is
11  begin
12  return b+1;
13  end myfunc;
14  end testpak;
15  /

Package body created.

SQL> remark .............................................................
SQL> remark 包和作用域:包头中声明的任何对象都是在其作用域中,使用包名.对象名 可以调用包中对应的对象;
SQL> remark 在包体中:包头中的 对象可以直接的引用,可以不用包名.
SQL> remark 包头中的变量是全局的  子过程中的变量是局部的;
SQL> create or replace package testpak
  2  as
  3  thecount int:=0;
  4  function add(m int) return int;
  5  procedure getcount;
  6  end;
  7  /

Package created.

SQL> remark 创建包体
SQL> create or replace package body testpak
  2  is
  3  function add(m int) return int
  4  is
  5  begin
  6  thecount:=thecount+m;
  7  return thecount;
  8  end add;
  9  procedure getcount
10  is
11  begin
12  dbms_output.put_line(thecount);
13  end getcount;
14  end;
15  /

Package body created.

SQL> remark 调用包体中的函数;
SQL> declare
  2  result int;
  3  begin
  4  result:=testpak.add(5);
  5  dbms_output.put_line('函数的运算结果为:'||result);
  6  dbms_output.put_line('当前包内的参数值为:'||testpak.thecount);
  7  testpak.getcount;
  8  end;
  9  /
函数的运算结果为:5                                                            
当前包内的参数值为:5                                                           
5                                                                              

PL/SQL procedure successfully completed.

SQL> /
函数的运算结果为:10                                                            
当前包内的参数值为:10                                                         
10                                                                              

PL/SQL procedure successfully completed.

SQL> remark 包中子过程的重载
SQL> remark 在包的内部,过程和函数可以被重载(overloding) 也就是说:可以有一个以上名称相同的,但参数不同的过程或函数。
SQL> remark 示例:子过程中的重载
SQL> create or replace package testpak
  2  as
  3  thecount int :=0;
  4  function add(m int) return int;
  5  function add(m int , n int) return int;
  6  procedure getcount;
  7  end;
  8  /

Package created.

SQL> remark 创建包体:实现包头中的函数和过程
SQL> create or replace package body testpak
  2  is
  3  function add(m int) return int
  4  is
  5  begin
  6  thecount:=thecount+m;
  7  return thecount;
  8  end add;
  9  
10  function add(m int , n int) return int
11  is
12  begin
13  thecount:=thecount+m+n;
14  return thecount;
15  end add;
16  
17  procedure getcount
18  is
19  begin
20  dbms_output.put_line(thecount);
21  end getcount;
22  end;
23  /

Package body created.

SQL> remark 调用函数和存储过程
SQL> declare
  2  result int;
  3  begin
  4  dbms_output.put_line('调用add(m int)的函数:');
  5  result :=testpak.add(5);
  6  dbms_output.put_line('当前包内thecount的值为:'||testpak.thecount);
  7  dbms_output.put_line('调用add(m int,n int)的函数:');
  8  result :=testpak.add(5,5);
  9  dbms_output.put_line('当前包内thecount的值为:'||testpak.thecount);
10  end;
11  /
调用add(m int)的函数:                                                         
当前包内thecount的值为:5                                                        
调用add(m int,n int)的函数:                                                   
当前包内thecount的值为:15                                                      

PL/SQL procedure successfully completed.

SQL> spool off;
[size=x-large]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256316-1-1.html 上篇帖子: Oracle TNSListener服务启动后自动停止问题 下篇帖子: oracle 插入游标 相当于主键约束
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表