程序包简单解释

程序包概述

程序包是对一系列对象(变量、常量、过程、函数、游标、异常等)的封装,由规范和主体两部分组成。

包的作用如下:

  • 避免命名冲突和加强模块化管理,便于管理和区分
  • 使用包可以增强安全性
  • 可以创建私有的函数过程,只能被相同包中其他函数和过程调用

创建一个完整的程序包

一、语法格式

--创建包头(创建内外均可使用的变量或常量,告诉外界箱内的东西使外界能使用)
create [or replace] package 包名 is
[公有变量声明部分];
[包内对象声明部分];
end;
--创建包体(包内对象定义部分,私有变量声明部分)
create [or replace] package body 包体 is
[私有变量声明部分];
[私有对象定义部分];
end;
  • 包体包头兼备才能称之为一个完整的包(包体、包头名一致)
  • 对包头,包体的简单理解举例如下:

以一个超市促销为假想环境,包头就是超市对外宣称的促销活动,告诉你我们有什么活动;包体就是超市内部制定的促销规则如什么人能参加促销了。。。

二、代码示例

  • 包内存储无参数存储过程与函数

--创建包头
create or replace package pac1
is
       --声明公有变量
       a number:=90;
       
       --声明存储过程p1
       procedure p1;
       
       --声明函数f1
       function f1 return varchar2;
       
end;

--创建包体
create or replace package body pac1
is
       --声明私有变量
       b number:=50;
       
       --存储过程p1定义部分
       procedure p1 is
         begin
           dbms_output.put_line('hello world');
         end;
       --函数f1定义部分
       function f1 return varchar2  is
         begin
           return '你好 世界';
         end;
end;

--调用
begin
  pac1.p1;
  dbms_output.put_line(pac1.f1);
end;

在这里插入图片描述

  • 包内存储带参数存储过程与函数
--创建包头
create or replace package pac2
is
       --声明公有变量
       a number:=90;
       
       --声明存储过程p1
       procedure p1(v_empno in number);
       
       --声明函数f1
       function f1(v_a in  number) return varchar2;
       
end;

--创建包体
create or replace package body pac2
is
       --声明私有变量
       b number:=5;
       
       --存储过程p1定义部分
       procedure p1(v_empno in number) is
         v_ename varchar2(255);
         begin
           select ename into v_ename from emp where empno=v_empno;
           dbms_output.put_line('姓名:'||v_ename);
         end;
       --函数f1定义部分
       function f1(v_a in number) return varchar2  is
         begin
           dbms_output.put_line(v_a);
           return '你好 世界';
         end;
end;

--调用    
begin
  pac2.p1(7566);
  dbms_output.put_line(pac2.f1(pac2.a));
end;

在这里插入图片描述

调用程序包下的内容

包名.对象名;

删除程序包

--删除包头,包体跟着消失('砍头身死')
drop package 包头名;
--删除包体,包头还在
drop package body 包体名;

程序包中游标

  • 显式游标
--创建包头
create or replace package pack3 is
  --声明游标a
  cursor a return emp%rowtype;
  --声明存储过程p1
  procedure p1;
end;

--创建包体
create or replace package body pack3 is
		--包头声明了cursor,游标a必须写在该处
       cursor a return emp%rowtype  is select * from emp;
       --存储过程p1定义
       procedure p1 is
         begin
           for i in a loop
             dbms_output.put_line(i.ename);
           end loop;
         end;
end;

--调用
begin
  pack3.p1;
end;

在这里插入图片描述

  • ref游标
--创建包头
create or replace package pack4 is
  --声明ref游标类型a
  type a is ref cursor;
  --声明存储变量p1
  procedure p1;
end;

--创建包体
create or replace package body pack4 is
  --声明私有变量c
  c emp%rowtype;
  --定义p1
  procedure p1 is
      --定义承载ref游标类型的变量b(该变量不能在包外部声明)
      b a;
      begin
       open b for select * from emp;
         loop
           fetch b into c;
           exit when b%notfound;
           dbms_output.put_line(c.ename);
          end loop;
        close b;
      end;
end;

--调用
begin
  pack4.p1;
end;

在这里插入图片描述

包头中声明的对象包体中必须定义,包体中定义的对象可以不在包头中声明(变量无所谓因为有公有私有变量存在)

在这里插入图片描述

内置程序包

内置程序包功能如下:

  • 扩展数据库功能
  • 为pl/sql提供对sql功能的访问

用户 SYS 拥有所有程序包,程序包是公有同义词,可以由任何用户访问

内置程序包举例如下:
在这里插入图片描述
使用举例如下:

  • DBMS_RANDOM包的的使用

(1)产生随机数

select dbms_random.random from dual;

(2)随机产生指定范围内数

--随机产生0-100的数字
select dbms_random.value(0,100) from dual;
--随机产生0-100的整数
select trunc(dbms_random.value(0,100)) from dual;

(3)随机产生字符串

/*
U——生成大写字符
L——生成小写字符
A——生成大小写混合的字符
P——生成任意可打印字符
X——生成由大写字符和数字构成的字符串。 
*/
SELECT DBMS_RANDOM.STRING('A', 5) FROM DUAL; 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值