包体 :
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 ;
1.DBMS_ALERT 包 : 用于数据库报警 , 允许会话间通信
2.DBMS_JOB: 用于任务调度服务
3.DBMS_LOB: 用于处理大对象操作
4.DBMS_PIPE 包 : 用于数据库管道 , 允许会话间通信
5.DBMS_SQL 包 : 用于执行动态 SQL
6.UTL_FILE 包 : 用于文件的输入输出
除了 UTL_FILE 包存储在服务器和客户端外 , 其他的包均存储在服务器中 。
在编译包的过程中,出现了如下的错误:
1、Error:PLS-00323: 子程序或游标 已在程序包说明中声明, 必须在程序包体中对其进行定义。
错误原因:包头里面定义的函数和包体里面函数的参数不同,出现的错误。
2、如果编译完成,在执行时,包是不会提示错误的,此时就需要自己来查找错误。我使用的方法是在过程中将sql调好之后再放到包中运行。