欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle的Package的作用

程序员文章站 2022-07-04 10:58:51
简化应用设计、提高应用性能、实现信息隐藏、子程序重载。 1、oracle的package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)? 你不觉得把存储过程分门别类是很重要的么,而且不同的...

简化应用设计、提高应用性能、实现信息隐藏、子程序重载。

1、oracle的package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)?

你不觉得把存储过程分门别类是很重要的么,而且不同的package的存储过程可以重 名。

用package不仅能把存储过程分门别类,而且在package里可以定义公共的变量/类型,既方便了,又减少了服务器的编译开销。

2、如何把现有的存储过程加入到package中?

copy and pasty,不过调用的时候要带包名了。

3、除了使用sql plus,还有没有什么工具做package?

也有方便的第三方工具了,不过得自己找了。

用第三方工具吧,比如sql navigator。

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包存储在服务器和客户端外,其他的包均存储在服务器中