PL/SQL之--包
一、包
包是一组相关过程、函数、常量、变量、游标、异常等PL/SQL程序设计元素的组合。它类似于C++和Java中的类,其中变量相当于类中的成员变量,过程和函数相当于类中的方法。通过使用包,可以使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统的性能。
包的结构如下:
一个包由包头和包主体组成:
- 包头(package):包头部分声明包内数据类型、变量、常量、游标、子程序(只有声明)和异常错误处理等元素,这些元素为包的共有元素。
- 包主体(package body):包主体则是包定义部分的具体实现,它负责为包头中所声明包的私有元素。
包头和包主体分开编译,并作为两个分开的对象存放在数据库数据字典中。
包的大体语法如下:
包头语法:
CREATE OR REPLACE PACKAGE 包名称 IS
FUNCTION 函数名称(参数 参数类型) RETURN 参数类型;
PROCEDURE 存储过程名称( 参数 输入输出类型 参数类型,参数 输入输出类型 参数类型) ;
end;
包体语法:
create or replace package body 包名称 is
function 函数名称(参数名称 参数类型) return 参数类型 is
begin
处理语句
return 参数;
end;
procedure 存储过程名称( 参数 输入输出类型 参数类型,参数 输入输出类型 参数类型 ) is
begin
处理语句;
commit;
end;
end;
二、示例代码
示例如下:
--包头
CREATE OR REPLACE PACKAGE fkpackage IS
v_comm NUMBER := 200 ; --每月奖金200
--定义结构体
type re_person is record(
rid person.id%type,
rusername person.username%type,
rage person.age%type,
rpassword person.password%type
);
--定义游标
type t_person is ref cursor;
--计算年薪的函数
FUNCTION get_year_sal (v_sal NUMBER) RETURN NUMBER ; --定义过程
PROCEDURE pro_person_add (
v_id NUMBER,
v_username VARCHAR2,
v_age NUMBER,
v_password VARCHAR2
) ;
procedure get_person(
v_id in number,
c_person out t_person
);
END fkpackage ;
--包体
create or replace package body fkpackage is
-- 函数
function get_year_sal (v_sal NUMBER) RETURN NUMBER IS
BEGIN
RETURN (v_sal + v_comm) * 12 ;
END;
--过程
procedure pro_person_add(v_id number, v_username varchar2, v_age number, v_password varchar2) is
BEGIN
INSERT INTO person VALUES (v_id, v_username, v_age, v_password);
COMMIT;
END;
procedure get_person(v_id in number, c_person out t_person) is
begin
open c_person for select id,username,age,password from person;
end;
END;
调用代码:
declare
r_person fkpackage.t_person; --定义包中结构体变量
record_person fkpackage.re_person;
v_id number;
begin
--使用及遍历包中过程返回的结果集
dbms_output.put_line('年薪='||fkpackage.get_year_sal(12000));
v_id := 1;
fkpackage.get_person(v_id, r_person);
loop
fetch r_person into record_person;
exit when r_person%notfound;
dbms_output.put_line('姓名='||record_person.rage);
end loop;
-- 添加数据
fkpackage.pro_person_add(10001, 'zhangsan', 20, '');
end;
三、 PL/SQL包的优点
包提供了几个优点:模块化、方便应用程序设计、信息隐藏、附加功能和良好的性能。
1、 模块化
包能让我们把逻辑相关的类型、常量、变量、异常和子程序等放到一个命名的PL/SQL模块中。每一个包都容易理解,包与包之间接口简单、清晰。这将有助于程序开发。
2、 轻松的程序设计 设计应用程序时,我们首先要确定的是包说明中的接口信息。我们可以在没有包体的条件下编写并编译说明部分。然后引用该包的存储子程序也会被编译。在完成整个应用程序之前,我们是不需要完全实现包体部分的。
3、 信息隐藏
有了包,我们就可以指定哪些类型、常量、变量、异常和子程序等是公有(可见和可访问)或私有(隐藏和不可访问)。例如,如果一个包里包含了四个子程 序,其中三个是公有的一个是私有的。包就会隐藏私有子程序的实现,这样的话,如果实现内容发生改变,受到影响的只有包本身(不是我们的应用程序)。同样, 对用户隐藏实现细节也能保证包的完整性。
4、 附加功能
打包公有变量和游标在一个会话期会一直存在。所以,它们可以被当前环境下的所有子程序共享。并且它们允许我们跨事务来维护数据而不用把它保存在数据库中。
5、 良好的性能
在我们首次调用打包子程序时,整个包就会被加载到内存中。所以,以后调用包中的相关子程序时,就不需要再次读取磁盘了。包能阻塞级联依赖,这样就能避免不必要的编译。例如,如果我们改变打包函数的实现,Oracle不需要重新编译调用子程序,因为它们并不依赖于包体。
四、系统中的包
Oracle和各种Oracle工具都提供了系统包来帮助我们建立基于PL/SQL的应用程序。下面介绍一下其中比较典型的包。
1、 关于DBMS_ALERT包
DBMS_ALERT能让数据库触发器在特定的数据库值发生变化时向应用程序发送报警。报警是基于事务的并且是异步的(也就是它们的操作与定时机制无关)。例如,当新的股票和债券上市时公司就可以通过这个包更新来他的投资总额。
2、 关于DBMS_OUTPUT包
包DBMS_OUTPUT能让我们显示来自PL/SQL块和子程序中的输出内容,这样就会很容易地进行测试和调试。过程put_line能把信息输 出到SGA的一个缓存中。我们可以通过调用过程get_line或在SQL*Plus中设置SERVEROUTPUT ON就能显示这些信息。
3、 关于DBMS_PIPE包
包DBMS_PIPE允许不同的会话通过命名管道来进行通信(管道就是一块内存区域,进程使用这个区域把消息传递给另外一个进程)。我们可以使用过 程pack_message和send_message把消息封装到一个管道,然后把消息发送到同一个实例中的另一个会话中。 管道的另一个终端,我们可以使用过程recieve_message和unpack_message来接受并打开要读取的消息。命名管道在很多地方都很有用。例如,我们可以用C语言编写一个收集信息的程序,然后把信息通过管道传递给存储过程。
4、关于UTL_FILE包
包UTL_FILE能让我们的PL/SQL程序读写操作系统(OS)文本文件。它提供了标准的OS流文件I/O,包括open、put、get和close操作。当我们想要读写文件的时候,我们可以调用函数fopen,它能返回一个在后续过程调用中使用到的文件句柄。例如,过程put_line能往打开的文件中写入文本字符串,并在后边添加一个换行符,过程get_line能从打开的文件读取一行内容到放到一个输出缓存中。
5、关于UTL_HTTP包
包UTL_HTTP可以让我们PL/SQL程序使用超文本传输协议(HTTP)进行通信。它可以从互联网接收数据或调用Oracle Web服务器的cartridge。这个包有两个入口点,每一个都接受一个URL(统一资源定位器)字符串,然后连接到一个指定的网站并返回所请求的数 据,这些数据通常是超文本标记语言HTML格式。
PL/SQL之--包的更多相关文章
- PL/SQL之包
1.包的定义 一个包由两个独立的部分组成--包头和包体.给部分被单独地存放在数据字典中. .1定义包头 语法: CREATE [OR REPLACE] PACKAGE [schema.] packag ...
- PL/SQL编程—包
1.PLSQL 中的包就相当于java中的package,主要好处有(1)防止命名污染,(2)功能统一,(3)允许重载,(4)可以隐藏核心代码,(5)最重要的就是断开依赖链. 2.对于一个程序需要大量 ...
- PL/SQL 09 包 package
--定义包头 create or replace package 包名as 变量.常量声明; 函数声明; 过程声明;end; --定义包体 create or replace package b ...
- Insert BLOB && CLOB from PL/SQL and JDBC
For PL/SQL 1)Create Directory Where BLOB resides. create or replace directory temp as '/oradata2'; - ...
- Oracle基础(五)pl/sql进阶(分页过程)
编写分页过程 通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...
- 使用集成SOA网关的PL / SQL中的REST
使用集成SOA网关的PL / SQL中的REST Oracle电子商务套件集成SOA网关(ISG)是一款开箱即用的模块,支持在Oracle Integration Repository中发布支持的接口 ...
- Oracle PL/SQL入门之慨述
Oracle PL/SQL入门之慨述 一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言( ...
- PL/SQL -->隐式游标(SQL%FOUND)
PL/SQL -->隐式游标(SQL%FOUND) 分类: SQL/PLSQL 基础2010-12-22 16:23 4084人阅读 评论(0) 收藏 举报 sqlexceptionoracle ...
- PL/SQL重新编译包无反应
前几天碰到一个有趣的事情:早上同事执行一个包很久没有反应,就中断了执行,发邮件让我帮忙查看具体情况,我用PL/SQL Developer登录后,找到这个包的过程中发现这个包的图标有红色叉叉,也就是说这 ...
随机推荐
- adaboost原理和实现
上两篇说了决策树到集成学习的大概,这节我们通过adaboost来具体了解一下集成学习的简单做法. 集成学习有bagging和boosting两种不同的思路,bagging的代表是随机森林,boosti ...
- Criteria查询数据
Criteria介绍: Criteria查询是Hibernate提供的一种查询方式,与HQL基于字符串的查询形式完全不同.Hibernate提供了org.hiberanee.Criteria 接口.o ...
- [JS] JavaScript由浅入深(1) 基本特性
1.全局变量的特性: 在函数体内直接写的变量(未用var标志)自动升级为全局变量. (function func() { i = 100; }()); alert(i); 非常不建议不写var. va ...
- JavaScript--DOM修改元素的属性
一旦你获得了要修改的元素,可以有2种方式,来读取和修改它的属性:一种老的方式(它被更多的用户代理所支持)和一种新的DOM方法的方式.老的和新的用户代理都允许你以对象属性的方式获取和设置元素的属性. 先 ...
- 创建一个带模版的用户控件 V.2
前面有做练习<创建一个带模版的用户控件>http://www.cnblogs.com/insus/p/4161544.html .过于简化.通常使用数据控件Repeater会有网页写好He ...
- 循序渐进开发WinForm项目(2)--项目代码的分析
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- cURL和HTTPie
http://lingxiankong.github.io/blog/2014/08/19/curl-httpie/ 前两天在网上看到一个号称比cURL更牛逼的命令行工具HTTPie,提供命令行交互方 ...
- KMP--Simpsons’ Hidden Talents
题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110060#problem/C Description Homer: Marge ...
- jquery重置html form
很多时候在ajax提交或者对话框隐藏之后,我们希望重置默认值以便下次打开对话框时保持干净. 因为jquery选择器返回的是list,并且没有对此提供reset方法,所以需要针对单个元素进行reset. ...
- javascript-this,call,apply,bind简述2
上节我们一起研究了this这个小兄弟,得出一个结论,this指向调用this所在函数(或作用域)的那个对象或作用域.不太理解的朋友可以看看上节的内容,这次我们主要探讨一下call(),apply(), ...