当前位置:网站首页>程序包简单解释
程序包简单解释
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;
边栏推荐
猜你喜欢
Wei Dongshan Digital Photo Frame Project Learning (5) Transplantation of libjpeg-turbo
IPv4编址;A类、B类、C类、D类、E类IP地址(IP地址;网络地址和主机地址;子网掩码;网关;广播地址;)
VS中使用BugTrap定位程序崩溃点
IDEA如何创建父子工程
Pro_07丨波动率因子3.0与斜率因子
为什么要使用 playwright 做浏览器自动化测试?
网易数帆陈谔:云原生“牵手”低代码,加速企业数字化转型
5. Software testing ----- automated testing
在VScode里调试ROS程序
zyMedia系列之播放视频
随机推荐
C语言——结构体(声明、内存对齐、自引用)、位段、联合体、枚举常量合集
Spark SQL简介
网易数帆陈谔:云原生“牵手”低代码,加速企业数字化转型
怎么从零编写一个 v3 版本的 chrome 浏览器插件实现 CSDN 博客网站的暗黑和明亮主题切换?
# RACE32——高级断点的设置和应用
二叉树的前序遍历、中序遍历、后序遍历和层序遍历
05-分布式计算框架
Interconversion between numpy PIL tensors
C语言——-动态内存开辟与管理(malloc,free,calloc,realloc)+柔性数组
【UE4】搭建局域网内VR直播 UE4.27
通过kubernetes可视化界面(rancher)安装kibana
详细讲解一下JVM的内存模型与实现?
超级复杂可贴图布局的初级智能文本提示器
vs studio install opencv environment
MySQL-Explain详解
【Flink】如何生成 Flink 作业的交互式火焰图?
Summary of some interviews
[Arduino] Reborn Arduino Monk (3)----Arduino function
qt opengl 使用不同的颜色绘制线框三角形
SqlSession [[email protected]]