一、PL/SQL包概述

1. 什么是PL/SQL包:

相关组件的组合:PL/SQL类型、变量,数据结构,和表达式、子程序: 过程和函数

2. 包的组成部分:

由两部分组成:

包头

包体

3. 包的优点

一次读取多个对象进入内存

二、PL/SQL包的组件

包头:公共部分:包内和包外的程序都可以访问

包体:私有部分:包体定义的变量或者程序只能被本包内的程序调用

1. 创建包头

语法:

CREATE [OR REPLACE] PACKAGE package_name IS|AS
public type and variable declarations
subprogram specifications
END [package_name];

OR REPLACE选项删除并且重新创建包

在包头声明的变量初始化值默认为NULL

所有在包头声明的结构,对于所有授予该包权限的用户都是可见的

包声明示例: comm_pkg

CREATE OR REPLACE PACKAGE comm_pkg IS
std_comm NUMBER := 0.10; --initialized to 0.10
PROCEDURE reset_comm(new_comm NUMBER);
END comm_pkg;
/ STD_COMM 是一个全局变量,初始为0. RESET_COMM 用于重新设置奖金的过程,它在包体中被定义

2. 创建包体

语法:

CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS
private type and variable declarations
subprogram bodies
[BEGIN initialization statements]
END [package_name];

OR REPLACE选项删除并且重新重建包体

包体中定义的标识符是私有的,包体之外不可见

所有的私有结构,在引用前必须先声明

公共结构在包体中是可见的

create or replace package comm_pkg is
std_comm number := 0.10;
procedure reset_comm(new_comm number);
end; create or replace package body comm_pkg is
function validate(comm number) return boolean is
max_comm employees.commission_pct%type;
begin
select max(commission_pct) into max_comm from employees;
return(comm between and max_comm);
end validate; procedure reset_comm(new_comm number) is
begin
if validate(new_comm) then
std_comm := new_comm;
else
raise_application_error(-, 'Bad Commission');
end if;
end reset_comm;
end;

三、调用包中的子程序

在同一个包内调用子程序:

CREATE OR REPLACE PACKAGE BODY comm_pkg IS ...
PROCEDURE reset_comm(new_comm NUMBER) IS
BEGIN
IF validate(new_comm) THEN
std_comm := new_comm;
ELSE ...
END IF;
END reset_comm;
END comm_pkg;

在sqlplus中调用包中的过程:

SQL> execute comm_pkg.reset_comm(0.15);
SQL> set serveroutput on;
SQL> ed declare
v_std_comm comm_pkg.std_comm%type;
begin
v_std_comm := comm_pkg.std_comm;
dbms_output.put_line(v_std_comm);
end;
/ 结果:
SQL> /
std_comm:.
PL/SQL procedure successfully completed

在不同模式下调用包内的过程

SQL> conn hr/hr

SQL> grant execute on comm_pkg to scott;

conn scott/tiger

SQL> execute comm_pkg.reset_comm(0.36);
PL/SQL procedure successfully completed SQL>
SQL> declare
v_std_comm comm_pkg.std_comm%type;
begin
v_std_comm := comm_pkg.std_comm;
dbms_output.put_line('v_std_comm:' || v_std_comm||'std_comm:' || comm_pkg.std_comm);
end;
/
v_std_comm:.36std_comm:.
PL/SQL procedure successfully completed

注意:千万不要在sql窗口中写入这段话,不然执行过程是在sql中执行,全局变量存在于sql进程中吗,不会存在sql窗口中,所以在sql窗口中访问到的永远都是std_comm的初始值:0.10

四、创建和使用无体包

create or replace package global_consts is
mile_2_kilo CONSTANT NUMBER := 1.6093;
kilo_2_mile CONSTANT NUMBER := 0.6214;
yard_2_meter CONSTANT NUMBER := 0.9144;
meter_2_yard CONSTANT NUMBER := 1.0936;
end;

无体包内声明的变量时全局变量,包外的子程序或者匿名块都可以使用

在匿名块中使用:

BEGIN
DBMS_OUTPUT.PUT_LINE('20 miles = ' || * global_consts.mile_2_kilo ||
' km');
END;

在子程序中调用:

CREATE FUNCTION mtr2yrd(m NUMBER) RETURN NUMBER IS
BEGIN
RETURN(m * global_consts.meter_2_yard);
END mtr2yrd; begin
DBMS_OUTPUT.PUT_LINE(mtr2yrd());
end;

五、在数据字典中查看包的信息

查看包头信息:

SELECT text
FROM user_source
WHERE name = 'COMM_PKG'
AND type = 'PACKAGE';

查看包体信息:

SELECT text
FROM user_source
WHERE name = 'COMM_PKG'
AND type = 'PACKAGE BODY';

六、使用包的优势

1. 模块化: 封装相关的结构

2. 更加容易维护: 将相关的逻辑功能组合到一起

3. 使应用设计更加容易: 包头和包体的编译是分开进行的

4. 隐藏信息:

对于应用,只有声明部分是可见的

包体的私有部分被隐藏并且不能被应用访问

包体中的所有代码被隐藏

5. 提高了性能:

当包第一次被引用的时候,包内的所有内容全部被加载到内存中

对于所有的用户来讲,在内存中只复制一次

简化了依赖性

6. 重载: 多个子程序相同的名

七、删除包

使用如下语法删除包头和包体:

DROP PACKAGE package_name;

删除包体语法:

DROP PACKAGE BODY package_name; 

oracle包概述(一)【weber出品】的更多相关文章

  1. ORACLE复制数据库【weber出品】

    一.概述 在公司中,我们会经常面临着一种情况.我们制定了对数据库的操作方案后,还不可以在真正的数据库上执行,需要在备用数据库进行测试,这个时候就需要备用数据上的数据和真正数据库的数据是一模一样的.我们 ...

  2. ORACLE调度之基于时间的调度(一)【weber出品】

    一.调度的概述 这里我看到一篇对调度的概述觉得描述的比我好,但仅限于概述部分,其他部分我觉得我讲的比他好,于是发生以下事情: ************************华丽的转载******** ...

  3. 全世界最详细的图形化VMware中linux环境下oracle安装(一)【weber出品必属精品】

    安装流程:前期准备工作--->安装ORACLE软件--->安装升级补丁--->安装odbc创建数据库--->安装监听器--->安装EM <前期准备工作> 安装 ...

  4. ORACLE调度之基于事件的调度(二)【weber出品】

    一.回顾 调度分基于时间的调度和基于事件的调度. 稍微复习一下前面的只是请浏览:<ORACLE调度之基于时间的调度(一)[weber出品]> 二.知识补充 1.队列:一种数据结构,就像一根 ...

  5. 全世界最详细的图形化VMware中linux环境下oracle安装(二)【weber出品必属精品】

    <ORACLE 10.2.05版本的升级补丁安装> 首先我们解压 $ unzip p8202632_10205_LINUX.zip 解压后我们会发现多出了个文件夹,他是:Disk1,进入D ...

  6. 1.Oracle数据库概述

    Oracle数据库概述 1.1Oracle结构图 1.1如何访问数据库 a.本机直接通过sock(套接字)方式访问  IPC UDP协议 ,不需要网络 b.通过tcp建立连接到oracle服务器 1. ...

  7. ORACLE触发器概述之【语句触发器】【weber出品】

    一.触发器概述 与表,视图,模式,或者数据库相关的PL/SQL过程,当触发条件被触发时,自动执行 分类: 1.语句触发器 2.行触发器 二.语句触发器 1. 什么是语句触发器 语句触发器,是指当执行D ...

  8. oracle包详解(二)【weber出品】

    一.重载子程序 PL/SQL中的重载功能: 1. 能够使用户创建两个或多个同名的子程序 2. 要求子程序的形式参数的数量,顺序或者数据类型不一样 3. 能够使用户使用不同的数据灵活的调用子程序 4. ...

  9. ORACLE触发器概述之【行触发器】【weber出品】

    1. 行触发器的定义 行触发器是指执行DML操作时,每作用一行就触发一次的触发器.审计数据变化时,可以使用行触发器 2. 建立行触发器的语法如下: create or replace trigger ...

随机推荐

  1. sqllog 8.32 注册码

    注册信息: Name:kkkboy[CrSky] Registration code: Professional 17cb5c23-8653-418f-b81b-5582c7a5a2d7 Enterp ...

  2. css技巧之如何实现ul li边框重合

    提到边框重合,我们不妨打开淘宝首页浏览主体分类内容板块瞧瞧---亲,你看到了,正是这个,边框重合.其实我们不难发现,这个效果并不难,只是我们没有真正的动手做过而已,所以不知道怎么做,那么下面就是一个很 ...

  3. stack适配栈

    #include <stack> stack<int> s; s.empty() 如果栈为空,则返回 true,否则返回 stack s.size() 返回栈中元素的个数 s. ...

  4. secureCRT命令大全

    常用命令:一.ls 只列出文件名-a:列出所有文件,包含隐藏文件.(ll -a)-l:列表形式,包含文件的绝大部分属性.(ll)-r:递归显示.(ll -r)--help:此命令的帮助.(ll --h ...

  5. cf C. Vasya and Robot

    http://codeforces.com/contest/355/problem/C 枚举L和R相交的位置. #include <cstdio> #include <cstring ...

  6. Altium Designer 覆铜时过孔连接形式的设置——只将过孔连接设置为Direct Connect

    Altium Designer 在PCB覆铜时,所有的过孔和焊盘都是十字连接即Relief Connect连接的,没有像PROTEL 99SE一样只有接地的焊盘才是十字连接而过孔是直接连接的. 如下图 ...

  7. 自制单片机之七……扩展:DS18B20温度测量

    DS18B20数字温度测量传感器,网上介绍很多,我就不罗嗦了.见图 DS18B20与前产品DS1820的不同: DS18B20继承了DS1820的全部优点,并做了如下改进 1.供电范围扩大为3.0-- ...

  8. QT下实现对Linux Shell调用的几种方法

    使用QProcess QThread ============================================ #include <QProcess>int main(){ ...

  9. Linq to OBJECT延时标准查询操作符

    1.Where 操作符用于限定输入集合中的元素,将符合条件的元素组织声称一个序列结果.2.Select  操作符用于根据输入序列中的元素创建相应的输出序列中的元素,输出序列中的元素类型可以与输入序列中 ...

  10. bzoj2346[Baltic 2011]Lamp

    Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...