公司需求知识自学-Oracle的Package的作用及用法
Oracle的Package的作用
1、Oracle的Package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)?
你不觉得把存储过程分门别类是很重要的么,而且不同的package的存储过程可以重 名。
用package不仅能把存储过程分门别类,而且在package里可以定义公共的变量/类型,既方便了编程,又减少了服务器的编译开销。
2、如何把现有的存储过程加入到Package中?
copy and pasty,不过调用的时候要带包名了。
3、除了使用SQL Plus,还有没有什么工具做Package?
也有方便的第三方工具了,不过得自己找了。
用第三方工具吧,比如sql navigator。www.quest.com
4、使用SQL Plus编译Package,是否每次都是编译Package中所有的存储过程?
是
包也是一种命名pl/sql块,和存储过程、函数一下,都是在数据库启动的时候就载入内存的。开销的大小很难判断,因为你不用包,但是要完成包的功能的话,还是要用PL/SQL来完成的,服务器一样有开销。相对来说,用包少了SQL的语法分析、解释过程,开销还少一点。
“过程一般都不超过20行”那我倒很少遇到。用不用子过程关键要看是不是能定义可重用的子过程,用子过程效率不会低。
包的作用:包可以将任何出现在块声明的语句(过程,函数,游标,游标,类型,变量)放于包中,相当于一个容器.将声明语句放入包中的好处是:用户可以从其他PL/SQL块中对其进行引用,因此包为PL/SQL提供了全程变量.
包分为两部分:包头和包体.
如何创建包?
1)包头:
语法格式:
CREATE OR REPLACE PACKAGEpackage_name /*包头名称*/
IS|AS pl/sql_package_spec /*定义过程,函数以及返回类型,变量,常量及数据类型定义*/
定义包头应当遵循以下原则:
1)包元素位置可以任意安排.然而在声明部分,对象必须在引用前进行声明.
2)包头可以不对任何类型的元素进行说明.例如,包头可以只带过程和函数说明语句,而不声明任何异常和类型.
3)对过程和函数的任何声明都必须只对子程序和其参数进行描述,不能有任何代码的说明,代码的实现只能在包体中出现.它不同于块声明,在块声明中,过程和函数的代码可同时出现在声明部分.
2.包体:
语法格式:
CREATE OR REPLACE PACKAGE BODY package_name/*包名必须与包头的包名一致*/
IS | AS pl/sql_package_body /*游标,函数,过程的具体定义*/
包体是与包头相互独立的,包体只能在包头完成编译后才能进行编译.包体中带有包头中描述的子程序的具体实现的代码段.除此之外,包体还可以包括具有包体人全句属性的附加声明部分,但这些附加声明对于包头是不见的.
EG:定义一个包头
CREATE OR REPLACE PACKAGE select_table
IS
TYPE tab_02 IS RECORD
(
itnum_1 varchar2(1),
itnum_2 varchar2(1)
);
TYPE tab_03 IS RECORD
(
itnum_1 varchar2(1),
itnum_2 varchar2(1),
itnum_3 varchar2(1)
);
TYPE tab_04 IS RECORD
(
itnum_1 varchar2(1),
itnum_2 varchar2(1),
itnum_3 varchar2(1),
itnum_4 varchar2(1)
);
TYPE tab_05 IS RECORD
(
itnum_1 varchar2(1),
itnum_2 varchar2(1),
itnum_3 varchar2(1),
itnum_4 varchar2(1),
itnum_5 varchar2(1)
);
TYPE tab_06 IS RECORD
(
itnum_1 varchar2(1),
itnum_2 varchar2(1),
itnum_3 varchar2(1),
itnum_4 varchar2(1),
itnum_5 varchar2(1),
itnum_6 varchar2(1)
);
TYPE cur_02 IS REF CURSOR RETURNtab_02;
TYPE cur_03 IS REF CURSOR RETURNtab_03;
TYPE cur_04 IS REF CURSOR RETURNtab_04;
TYPE cur_05 IS REF CURSOR RETURNtab_05;
TYPE cur_06 IS REF CURSOR RETURNtab_06;
END select_tab;
EG:
CREATE OR REPLACE PACKAGE test_package
IS
FUNCTION average
(cnum IN char)
RETURN NUMBER;
PRODURE student_grade
(CUR OUT select_table.cur_04);--CUR的数据类型是select_table包中cur_o4
END test_package;
包体:
CREATE OR REPLACE PACKAGE BODY test_package
IS
/*函数实现开始*/
FUNCTION average
(cnum IN char)
RETURN NUMBER;
AS
avger NUMBER;
BEGIN
SELECT AVG(CJ) INTO avger FROM XS_KC WHERE KCH=cnum GROUP BYKCH;
RETURN(avger);
END average;
/*函数实现结束*/
/*过程实现开始*/
PRODURE student_grade
(CUR OUT select_table.cur_04);
AS
OPEN CUR FOR
SELECT XS.XH ,XS.XM,KC.KCM,XS_KC.CJ
FROM XS ,XS_KC,KC
WHERE XS.XH =XS_KC.XH AND XS_KC.KCH=KC.KCH;
END student_grade;
/*过程实现结束*/
END test_package;
重载:包中的函数和过程可以重载
以下条件不能重载:
1.如果两个子程序的参数仅在名称和类型上不同,这两个程序不能重载.
PROCEDURE overloadME(p_theparameterIN number);
PROCEDURE overloadME(p_theparameterOUT number);
IN ,OUT为参数类型,number为数据类型.两个过程仅在类型上不同时不能重载.
2.不能根据两个函数的返回类型对其重载
如:
FUNCTION overloadMeETooRETURN DATE;
FUNCTION overloadMeETooRETURN NUMER;
3.重载子程序的参数的类族必须不同,例如,由于CHAR和VARCHAR2属性同一类族,所以不能重载 .
PROCEDURE overloadME(p_theparameterIN char);
PROCEDURE overloadME(p_theparameterIN varchar2);
4.打包子程序也可以重载
5.包的初始化.
当第一次调用打包子程序时,该包将进行初始化.也就是说,将该包从硬盘中读入到内存,并启用调用的子程序的编译代码.这时,系统为该包中定义的所有变量分配内存单元.每个会话都有打其打开包变量的副本,以确保执行同一个包子程序的两个会话使用不同的内存单元.
在大多数情况下,初始化代码要在包第一次初始化时运行.为了实现这一功能,可以在包体中的所有对象之后加入一个初始化代码 .
语法格式:
CREATE OR REPLACE PACKAGE BODYpackage_name
IS|AS
............
BEGIN
Initialization_code;--要运行的初始化代码
END ;
ORACLE 内置包
1.DBMS_ALERT包:用于数据库报警,允许会话间通信
2.DBMS_JOB:用于任务调度服务
3.DBMS_LOB:用于处理大对象操作
4.DBMS_PIPE包:用于数据库管道,允许会话间通信
5.DBMS_SQL包:用于执行动态SQL
6.UTL_FILE包:用于文件的输入输出
除了
UTL_FILE包存储在服务器和客户端外
,其他的包均存储在服务器中
公司需求知识自学-Oracle的Package的作用及用法的更多相关文章
- 公司需求知识自学- Hashtable简单应用
定义表 Hashtable tblNames = new Hashtable(); 添加key,value键值对 tblNames.Add("A","a"); ...
- 公司需求知识学习-WCF
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- Oracle中 Package与Package body的介绍
1.Oracle Package的作用: 可以简化应用设计.提高应用性能.实现信息隐藏.子程序重载 2.ORACLE中的function .package.package bodies.pro ...
- Java调用Oracle存储Package
Oracle的包Package中可以有很多存储,可通过该包的总调入口在java中直接调用. //java调用oracle的package代码 public boolean cal() throws j ...
- 自学oracle数据库
1.因为自己要自学oracle数据库,所以就上网查了一下资料,总结了一下. 在以下连接有自学oracle的一下资料 博文中不让加入一些有广告的网站,请谅解,如有需要评论我私发. 2.学习Oracle的 ...
- HTML基础知识自学教程
HTML 是用来描述网页的一套标记标签,是我们在web前端开发中的基础.下面PHP程序员雷雪松主要结合自己的经验给大家分享下HTML的基础知识,以及在自学过程中一些比较常用的和重要的HTML知识点. ...
- Oracle分析函数及常用函数: over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名
(1) 函数: over()的作用及用法: -- 分区(分组)求和. sum() over( partition by column1 order by column2 )主要用来对某个字 ...
- Oracle函数over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名
(1) 函数: over()的作用及用法: -- 分区(分组)求和. RANK ( ) OVER ( [query_partition_clause] order_by_clause )D ...
- oracle 集合变量以及自定义异常的用法
oracle 集合变量以及自定义异常的用法, 在过程 record_practice 有record变量和自定义异常的用法实例.具体在3284行. CREATE OR REPLACE Package ...
随机推荐
- cookie的path和domain參数实例解析
一句话概括两个參数含义各为: path表示cookie所在的文件夹 domain表示的是cookie所在的域,默觉得请求的地址 首先改动我们的 hosts 文件 我本机内网ip 192.168.1.1 ...
- EL表达式(1)
JSP页面中支持使用EL表达式,EL全名为Expression Language.EL表达式的主要作用有: ① 获取数据: ② 执行运算: ③ 使用EL表达式的11大隐式对象: ④ 调用Java方法. ...
- C中的几组指针
1.二维数组 下面就三种二维数组进行说明. 1: int **Ptr; 2: int *Ptr[ 5 ]; 3: int ( *Ptr )[ 5 ]; 以上三例都是整数的二维数组,都可以用形如 Ptr ...
- wp实例开发精品文章源码推荐
WP8 启动媒体应用 这个示例演示了如何选择正确的msAudioCategory类别的音像(AV)流来配置它作为一个音频播放流.具体地说,这个示例执行以下操作:启动一个媒体应用与“媒体 ...
- Spring中的FactoryBean
从SessionFactory说起: 在使用SSH集成开发的时候,我们有时候会在applicationContext.xml中配置Hibernate的信息,以下是配置SessionFactory的一段 ...
- 解决sqlserver2008 r2 登陆时报错:provider 命名管道提供程序, error40 错误2
错误截图: 这种错误是因为无法启动sqlserver服务,进入命令行,输入 services.msc 进入服务管理,找到sqlserver服务如下图. 在这里启动该服务会报错如下图: 此服务无法启 ...
- TCP_NODELAY详解
在网络拥塞控制领域,我们知道有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个算 ...
- Visual Studio的SDK配置
Visual Studio的SDK Visual Studio 6.0自带的SDK是1998年的,目录为C:\Program Files\Microsoft Visual Studio\VC98\,这 ...
- 一个完善的ActiveX Web控件教程
免费打工仔:一个完善的ActiveX Web控件教程 出自Ogre3D开放资源地带 跳转到: 导航, 搜索 原作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一 ...
- Codeforces Round #249 (Div. 2) A B
C好像就是个模拟.D 是个编码复杂度大的,可是好像也就是枚举三角形,我这会儿准备区域赛,尽量找点思维难度大的,所以昨晚A B 还是去做区域赛题吧..... B 也有点意思 贪心 题意:交换相邻两个位的 ...