当前位置:网站首页>程序包简单解释
程序包简单解释
2022-08-03 02:42:00 【赟文武】
程序包概述
程序包是对一系列对象(变量、常量、过程、函数、游标、异常等)的封装,由规范和主体两部分组成。
包的作用如下:
- 避免命名冲突和加强模块化管理,便于管理和区分
- 使用包可以增强安全性
- 可以创建私有的函数过程,只能被相同包中其他函数和过程调用
创建一个完整的程序包
一、语法格式
--创建包头(创建内外均可使用的变量或常量,告诉外界箱内的东西使外界能使用)
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;
边栏推荐
- 详细讲解一下JVM的内存模型与实现?
- LVS负载均衡群集及部署LVS-NAT实验
- LabVIEW程序框图保存为图像
- 复杂多层布局的初级智能文本提示器
- monkey 压测
- IPv4编址;A类、B类、C类、D类、E类IP地址(IP地址;网络地址和主机地址;子网掩码;网关;广播地址;)
- [Arduino] Reborn Arduino Monk (3)----Arduino function
- 常用工具链和虚拟环境-Cygwin
- 常用工具链和虚拟环境-msys2与mingw
- sql问题,如何能做到先声明表的名称,例如product202201,表示2022年一月份的货物表,再在声明过的表中查找,下面的代码运行时有错误显示找不到表table_name,请问改如何进行修改
猜你喜欢
随机推荐
【Objective-C语言中的@property增强】
[Static type and dynamic type compile check and run check in Objective-C]
LVS负载均衡群集及部署LVS-NAT实验
禁用token及无感知更新token功能实现
企业上云规划与云原生环境设计
openCV第二篇
关于 Redis 必问面试题,你知道哪些?
Go新项目-编译项目的细节(4)
【GO记录】从零开始GO语言——用GO语言做一个示波器(二)基于arduino的简易示波器
【Arduino】重生之Arduino 学僧(2)----Arduino语言
如何画一张架构图(内含知识图谱)
服务器在线测速系统源码
Nacos入门学习
在VScode里调试ROS程序
Kook机器人开发日志01
370万欧元!西班牙iPronics加速可重构光子芯片商用
leetcode:153. 寻找旋转排序数组中的最小值
15【背景 渐变色】
5. Software testing ----- automated testing
openCV第一篇