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的作用及用法的更多相关文章

  1. 公司需求知识自学- Hashtable简单应用

    定义表 Hashtable tblNames = new Hashtable(); 添加key,value键值对 tblNames.Add("A","a"); ...

  2. 公司需求知识学习-WCF

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  3. Oracle中 Package与Package body的介绍

    1.Oracle Package的作用: 可以简化应用设计.提高应用性能.实现信息隐藏.子程序重载 2.ORACLE中的function   .package.package   bodies.pro ...

  4. Java调用Oracle存储Package

    Oracle的包Package中可以有很多存储,可通过该包的总调入口在java中直接调用. //java调用oracle的package代码 public boolean cal() throws j ...

  5. 自学oracle数据库

    1.因为自己要自学oracle数据库,所以就上网查了一下资料,总结了一下. 在以下连接有自学oracle的一下资料 博文中不让加入一些有广告的网站,请谅解,如有需要评论我私发. 2.学习Oracle的 ...

  6. HTML基础知识自学教程

    HTML 是用来描述网页的一套标记标签,是我们在web前端开发中的基础.下面PHP程序员雷雪松主要结合自己的经验给大家分享下HTML的基础知识,以及在自学过程中一些比较常用的和重要的HTML知识点. ...

  7. Oracle分析函数及常用函数: over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

    (1)   函数:  over()的作用及用法:    -- 分区(分组)求和. sum() over( partition by column1 order by column2 )主要用来对某个字 ...

  8. Oracle函数over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

    (1)   函数:  over()的作用及用法:    -- 分区(分组)求和. RANK ( ) OVER ( [query_partition_clause] order_by_clause )D ...

  9. oracle 集合变量以及自定义异常的用法

    oracle 集合变量以及自定义异常的用法, 在过程 record_practice 有record变量和自定义异常的用法实例.具体在3284行. CREATE OR REPLACE Package ...

随机推荐

  1. 算法设计与分析——多边形游戏(DP)

    1.问题描述:   给定N个顶点的多边形,每个顶点标有一个整数,每条边上标有+(加)或是×(乘)号,并且N条边按照顺时针依次编号为1~N.下图给出了一个N=4个顶点的多边形. 游戏规则 :(1) 首先 ...

  2. Passenger/Nginx/Debian快速部署Rails

    安装所需的linux包 sudo apt-get install build-essential bison openssl libreadline6 libreadline6-dev curl gi ...

  3. js之checkbox的代码全选/全不选,使用id获取元素,而不是name

    每当有多个选项的时候,都会有一种想法是:全选,全不选,如果子选项有被选,父选项也得被选. 注意:这里是根据id来获取元素的,但是不能直接用getElementById,因为那只能返回一个,而不是集合. ...

  4. UVA 565 565 Pizza Anyone? (深搜 +位运算)

      Pizza Anyone?  You are responsible for ordering a large pizza for you and your friends. Each of th ...

  5. 使用visual c++ 2005编译64位可执行文件

    最近需要将一个32位的程序移植到64位上,由于原来是使用vs2003写的,vs2003本身并不支持编译64位系统上,只能升级到vs2005以上版本.个人还是比较喜欢vs2005,对c++来说,vs20 ...

  6. C#多线程实现方法——Task/Task.Factary

    原文:C#多线程实现方法--Task/Task.Factary Task 使用 Task以及Task.Factory都是在.Net 4引用的.Task跟Thread很类似,通过下面例子可以看到. st ...

  7. android电池充电以及电量检测驱动分析

    前段时间比较烦躁,各种不想学习不想工作,于是休息了几天.这几天又下来任务了--调试充电电路和电池电量检测电路,于是又开始工作,顺便把调试过程记录下来. 平台: cpu        飞思卡尔imx6q ...

  8. linux kernel的函数与抽象层

    在数学领域,函数是一种关系,这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素. 在C语言中函数也有这种联系.自变量影响着因变量. 在linux内核驱动编程经常会有抽象层的概念 ...

  9. 并发编程实践五:ReentrantLock

    ReentrantLock是一个可重入的相互排斥锁,实现了接口Lock,和synchronized相比,它们提供了同样的功能.但ReentrantLock使用更灵活.功能更强大,也更复杂.这篇文章将为 ...

  10. Android资源管理框架(Asset Manager)简介和学习计划

    Android该应用程序包括两个部分组成的:代码和资源. 资源主要是与UI相关的东西,例如UI布局.和其他字符串和照片.代码和资源可以使独立的应用程序来组织的实际需求的基础上,在执行的时候UI.,就能 ...