oracle包定义,oracle中包的定义及使⽤
包的作⽤:包可以将任何出现在块声明的语句(过程,函数,游标,游标,类型,变量)放于包中,相当于⼀个容器.将声明语句放⼊包中的好处是:⽤户可以从其他PL/SQL块中对其进⾏引⽤,因此包为PL/SQL提供了全程变量.
包分为两部分:包头和包体.
如何创建包?
1)包头:
语法格式:
CREATE OR REPLACE PACKAGE package_name /*包头名称*/
IS|AS pl/sql_package_spec/*定义过程,函数以及返回类型,变量,常量及数据类型定义*/
定义包头应当遵循以下原则:
1)包元素位置可以任意安排.然⽽在声明部分,对象必须在引⽤前进⾏声明.
2)包头可以不对任何类型的元素进⾏说明.例如,包头可以只带过程和函数说明语句,⽽不声明任何异常和类型.
3)对过程和函数的任何声明都必须只对⼦程序和其参数进⾏描述,不能有任何代码的说明,代码的实现只能在包体中出现.它不同于块声明,在块声明中,过程和函数的代码可同时出现在声明部分.
2.包体:
语法格式:
CREATE OR REPLACE PACKAGE BODY package_name/*包名必须与包头的包名⼀致*/
IS | AS pl/sql_package_body/*游标,函数,过程的具体定义*/
oracle游标的使用包体是与包头相互独⽴的,包体只能在包头完成编译后才能进⾏编译.包体中带有包头中描述的⼦程序的具体实现的代码段.除此之外,包体还可以包括具有包体⼈全句属性的附加声明部分,但这些附加声明对于包头是不见的.
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 RETURN tab_02; TYPE cur_03 IS REF CURSOR RETURN tab_03; TYPE cur_04 IS REF CURSOR RETURN tab_04; TYPE cur_05 IS REF CURSOR RETURN tab_05; TYPE cur_06 IS REF CURSOR RETURN tab_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 BY KCH; 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_theparameter IN number);
PROCEDURE overloadME(p_theparameter OUT number);
IN ,OUT为参数类型,number为数据类型.两个过程仅在类型上不同时不能重载.
2.不能根据两个函数的返回类型对其重载
如:
FUNCTION overloadMeEToo RETURN DATE;
FUNCTION overloadMeEToo RETURN NUMER;
3.重载⼦程序的参数的类族必须不同,例如,由于CHAR和VARCHAR2属性同⼀类族,所以不能重载.
PROCEDURE overloadME(p_theparameter IN char);
PROCEDURE overloadME(p_theparameter IN varchar2);
4.打包⼦程序也可以重载
5.包的初始化.
当第⼀次调⽤打包⼦程序时,该包将进⾏初始化.也就是说,将该包从硬盘中读⼊到内存,并启⽤调⽤的⼦程序的编译代码.这时,系统为该包中定义的所有变量分配内存单元.每个会话都有打其打开包变量的副本,以确保执⾏同⼀个包⼦程序的两个会话使⽤不同的内存单元.
在⼤多数情况下,初始化代码要在包第⼀次初始化时运⾏.为了实现这⼀功能,可以在包体中的所有对
象之后加⼊⼀个初始化代码.
语法格式:
CREATE OR REPLACE PACKAGE BODY package_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包存储在服务器和客户端外,其他的包均存储在服务器中.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论