理解PL/SQL包

简介

包(package)的主要作用是用于逻辑组合相关的PL/SQL类型

比如记录类型或者集合类型,PL/SQL游标或游标声明以及PL/SQL子程序

还可以包含任何可以在块的声明区中定义的变量

或者说是

将功能或业务相似的存储过程,函数

以及类型等进行一个封装

包的组成

一个PL/SQL包由如下两部分组成

  • 包规范(包声明)

包规范: 主要是包的一些定义信息,不包含具体的代码实现部分

也可以说包规范是PL/SQL程序和其他应用程序的接口

包含类型,记录,变量,常量,异常定义,游标和子程序的声明

  • 包体

包体是对包规范中声明的子程序的实现部分

包体的内容对于外部应用程序来说是不可见的

包体就像是一个黑匣子一样,是对包规范的实现

包的优点

  • 1模块化设计

通过将逻辑相关的类型,常量,变量,异常和子程序放到一个命名的

pl/sql模块中,使得每一个包都容易理解,有助于模块化程序的开发

使得包与包之间的接口简单,清晰

  • 2规范化的程序设计

在基于包的应用程序设计时,可以首先规划并在包规范中定义包需要提供的功能

即便当前并没有实现包体,也可以编译包规范部分

然后引用该包的存储子程序会被编译

  • 3实现信息的隐藏

包规范中定义的常量,变量和异常及子程序等时公有的,可以被外部访问

可以规划将哪些内容公开给外部进行调用

如果不想对外公开,可以在包体中定义这些内容,这样就可以实现信息的隐藏

  • 4提供全局共享的附加功能

在包中公开的变量或游标在一个会话期会一直存在

因此可以将包中定义的变量当做全局变量来使用

  • 5提供了良好的性能体验

由于在首次打开包子程序时,整个包都会被加载到内存中

因而后续的调用只需要从内存中读取而不需要再次读取磁盘,

提供了较好的性能

包规范

语法

create or replace package 包名
is
--声明变量
--声明常量
--类型的定义
--游标的定义
--声明存储过程
procedure 存储过程名[(参数 in|out|in out 类型,..)];
--声明函数
function 函数名[(参数 类型,...)] return 返回值类型;
end[包名];

创建一个包规范

create or replace package pk1
is
--声明一个变量
s varchar2(50);
--声明一个常量
T constant varchar2(10):='TAB_';
--定义一个集合类型
type ity is table of varchar2(30);
--声明一个存储过程
procedure p1;
--声明函数
function fn(n number) return number;
end pk1;

包体

语法

create or replace package body 包名
is
--声明私有对象
--声明私有变量
--声明私有常量
--私有函数或存储过程
--公有对象的实现
end[包名];

注意:

包名,和包声明的名字一样

私有对象只能在包体内部调用,在最前面声明

创建一个包体

create or replace package body pk1
is
--声明变量
ss varchar(50);
--乘法表
procedure p1
is
begin
for i in 1..9 loop
for j in 1..i loop
dbms_output.put(i||'*'||j||'='||i*j);
end loop;
dbms_output.put_line('');
end loop;
end; --阶乘
function fn(n number) return number
is
--声明一个变量保存阶乘
s number(10) :=1;
begin
for i in 1..n loop
s:=i*s;
end loop;
return s;
end;
end;

调用

调用1

begin
pk1.s:=3;
dbms_output.put_line(pk1.s);
end;

输出1

3

调用2

begin
pk1.ss:=3;
dbms_output.put_line(pk1.ss);
end;

输出2

ORA-06550: 第 2 行, 第 7 列:
PLS-00302: 必须声明 'SS' 组件

变量ss在包体中声明,外部程序不能访问

调用3

begin
pk1.p1();
end;

输出3

1*1=1
2*1=22*2=4
3*1=33*2=63*3=9
4*1=44*2=84*3=124*4=16
5*1=55*2=105*3=155*4=205*5=25
6*1=66*2=126*3=186*4=246*5=306*6=36
7*1=77*2=147*3=217*4=287*5=357*6=427*7=49
8*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=64
9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81

调用&&输出4

SQL> select pk1.fn(4) from dual;
PK1.FN(4)
----------
24

oracle 包 简单使用的更多相关文章

  1. linux/windows系统oracle数据库简单冷备同步

    linux/windows系统oracle数据库简单冷备同步 我们有一个财务系统比较看重财务数据的安全性,同时我们拥有两套系统,一个生产环境(linux),一个应急备份环境(windows).备份环境 ...

  2. ORACLE 数据库简单测试

    ORACLE 数据库简单测试 操作系统:Windows 7 – ORACLE:oracle database 10.2.0.4 一.目的 测试 启动监听程序.数据库  非同一个用户的情况,用户是否可以 ...

  3. Oracle 最简单的随系统自己主动启动

    Oracle 最简单的随系统自己主动启动 俗话说用户是上帝,他们有时候提出一个问题很的简单,就仅仅须要一句话,一分钟就完事了.可是拿到我们DBA来说,可能至少得半个小时甚至半个月才干满足他的一句话.有 ...

  4. oracle 游标简单案例

    oracle  游标简单案例 一.案例: DECLARE IDO NUMBER; DABH CHAR); t_count ); CURSOR TJ_CURSOR IS SELECT IDO,DABH ...

  5. Java.util包简单总结

    Java.util包简单总结 1. util包的框架 常用的集合类主要实现两个“super接口”而来:Collection和Map. 1.1 Collection有两个子接口:List和Set è¿é ...

  6. oracle创建简单的包

    --规范 create or replace package test_pkg is --test_pkg为包名 procedure showMessage; --声明一个过程 function my ...

  7. MariaDB二进制包简单安装部署

    一.简介: MySQL最早是由Michael Widenius在所研发,而在后来Michael先生以10亿美元的价格把MySQL卖给了SUN以后不久SUN就被Oracle公司给收购了,在Oracle收 ...

  8. golang json 包简单分析

    首先上代码: func main() { b := true a1, _ := json.Marshal(b) a2, _ := Marshal(b) fmt.Println(string(a1)) ...

  9. Oracle 包(Package)

    引用这位大大的: http://www.cnblogs.com/lovemoon714/archive/2012/02/29/2373695.html 1.为什么要使用包?       答:在一个大型 ...

随机推荐

  1. oralce系统触发器

    系统事件是指基于oracle事件(例如logon.logoff和startup.shutdown)所建立的触发器,通过使用系统事件触发器,提供了跟踪系统或是数据库变化机制.下面介绍使用的系统事件属性函 ...

  2. C++ lambda表达式总结

    一个lambda表达式用于创建闭包.lambda表达式与任何函数类似,具有返回类型.参数列表和函数体.与函数不同的是,lambda能定义在函数内部.lambda表达式具有如下形式 [ capture ...

  3. 微服务开源生态报告 No.4

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

  4. markdown-it + highlight.js简易实现

    markdown-it 官方demo markdown-it 文档 1.配置highlightjs,针对markdown中各种语言高亮,针对对应的标签 pre code 里面的样式 -- index. ...

  5. photoshop正确的打开方式

    首先这边我先贴一个地址:https://www.adobe.com/cn/products/photoshop.html 安装软件,这里就不赘述了,真的不会,可以百度^_^我当初就是百度的,哈哈 说到 ...

  6. [React Native]去掉WebStorm中黄色警告

    用WebStorm开发RN难免会碰到一大堆黄色警告.就像下面这样. 其实这个错误并不会影响开发,但是作为一个上升处女座的,我很难忍.于是各种想办法. 上网查了半天发现这篇文章 http://blog. ...

  7. 在哈尔滨的寒风中EOJ 3461【组合数学】

    http://acm.ecnu.edu.cn/problem/3461/ 还是能力不够,不能看出来棋盘足够大时,马是可以到达任何位置的.还是直接看题解怎么说的吧:(http://acm.ecnu.ed ...

  8. Cmake在编译osgEarth时遇到的一个错误

    CMake Error at src/osgEarthDrivers/CMakeLists.txt:7 (PROJECT): The CMAKE_C_COMPILER: llvm-gcc-4.2 is ...

  9. SDUT-2124_基于邻接矩阵的广度优先搜索遍历

    数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一个无向连通图 ...

  10. xcode禁用代码分析的警告和内存泄漏

    在使用xcode进行iphone应用开发时,经常需要添加一些第三方的类库,而一些第三方的类库由于缺少维护,从而导致类库中含有各种警告和各种内存泄漏,但并不影响运行. 倘若我们需要用到第三方库,而由不想 ...