目录
1.Oracle中包
2.包的创建
(1)可视化方式创建包
(2)以命令方式创建包
①创建包头
②创建包体
③删除包
3.包的初始化
4.重载
①相关概念和注意事项
②系统内置的包
Oracle学习的相关知识点(汇总)
1.Oracle中包
(1)利用包可以将过程和函数安排在逻辑分组中;
(2)包有两个分离的部件:包说明(规范和包头)和包体(主体);他们都分别存储在数据字典中;
(3)包与过程和函数的区别:包仅能存储在非本地的数据库中;
(4)除了相关的对象结合组成,包与依赖性较强的存储子程序相比,其所受的限制较少,并且包的效率比较高;
(5)包就是一个命名的声明部分;任何可以出现在声明中的语句都可以在包中使用,包括过程,函数,游标,类型和变量。
2.包的创建
(1)可视化方式创建包
(2)以命令方式创建包
①创建包头
以命令的方式创建包的话,包含创建包头和包体。
CREATE [OR REPLACE]PACKAGE [<用户方案名>.]<包名>
IS | AS <PL/SQL程序序列>
提示:<PL/SQL 程序序列>中可以是变量,常量及数据类型定义,游标定义,函数,过程定义和参数列表返回类型等。
定义包头时注意以下几点:
(1)包元素的位置可以任意的安排;然而在声明部分,对象必须在引用前进行声明;
(2)包头可以不对任何类型的数据元素进行说明。如,包头可以只带过程和函数说明语句,而不声明任何异常和类型;
(3)对过程和函数的声明都只是对子程序及其参数进行描述,而不带任何代码的说明,实现代码只能在包体中。不同于块声明,在块声明中,过程或函数的代码可以同时出现在其声明部分(也就是在包中声明的,可以在包以外使用)。
②创建包体
CREATE [OR REPLACE]PACKAGE BODY[<用户方案名>.]<包名>
IS | AS <PL/SQL程序序列>
③删除包
删除包体:DROP PACKAGE BODY <包名>;
如果同时删除包名和包体:
DROP PACKAGE<包名>
根据上面创建包:
例子:求解学生表中的最高学分。
第一步:创建包头
--创建一个包DEMO_PACKAGE
CREATE OR REPLACE PACKAGE DEMO_PACKAGE
IS--这里没有参数
FUNCTION maxScore
--定义返回类型
RETURN NUMBER;
END;
第二步:创建包体(包体中将包头中定义的函数具体实现)
--创建包体
CREATE OR REPLACE PACKAGE BODY DEMO_PACKAGE
IS
FUNCTION maxScore
RETURN NUMBER
AS
maSco number;
BEGIN
SELECT MAX(score) INTO maSco
FROM XSB;
return maSco;
END maxScore;
END;
第三步:调用包中的函数
--调用包中的函数
DECLARE
maSco number;
BEGIN
maSco:=DEMO_PACKAGE.maxScore();
DBMS_OUTPUT.PUT_LINE('最高学分: '||to_char(maSco));
END;
3.包的初始化
当第一次再调用包子程序时,该包将进行初始化(也就是说,将该包从硬盘中读入内存,并启动调用的子程序编译代码,这时系统会该该包中的定义的所有变量分配内存单元)。
CRETE OR REPLACE PACKAGE BODY<包名>
IS | AS
...
BEGIN
<初始化代码>
END;
4.重载
①相关概念和注意事项
在包的内部,过程和函数都可以被重载,也就是如果C++一样,可以使用一个以上的相同名称,但是参数不同(这里的参数不同,不是指参数名称)。
注意:
(1)两个子程序的参数仅在名称和模式上不同,这个两个子程序是不能进行重载的,例如:
maxScore(ID IN varchar2)和maxScore(ID OUT varchar2);
也就是说不能通过参数名称和模式是否相同来判断可以不可以重载
(2)不能仅仅根据两个子程序的返回类型不同而进行重载,例如:
FUNCTION maxScore RETURN CHAR;
FUNCTION maxScore RETURN NUMBER;
(3)重载子程序的参数类族必须不同,其中的CHAR 和VARCHAR2属于同一个类族。
如maxScore(ID IN char)和maxScore(ID IN varchar2);这两个子程序是不能进行重载的。
②系统内置的包
(1)DBMS_ALERT包:用于数据库报警,允许会话通信;
(2)DBMS_JOB包:用于任务调度服务;
(3)DBMS_LOB包:用于大型对象操作;
(4)DBMS_PIPE包:用于数据库管道,允许会话间通信;
(5)DBMS_SQL包:用于执行动态的SQL;
(6)UTL_FILE包:用于文本文件的输入与输出。