包是存储在一起的相关对象组成的P L / S Q L结构
包有两个独立的部分,即说明部分和包体
这两部分独立地存储在数据字典中
包的类型:
1自定义包:
2 oracle内置包
自定义包:
包的规格说明部分:
CREATE [OR REPLACE] PACKAGE <package_name> IS|AS
<Public type and item declarations> -- 公有类型声明
< Public Subprogram specifications> -- 公有子程序声明
END <package_name>;
程序包主体部分:
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS|AS
<Private type and item declarations> -- 私有类型声明
< Private Subprogram bodies> -- 私有子程序体
< Private cursor define> -- 私有游标定义
< putblic Subprogram bodies> -- 公有子程序体
< putblic cursor define> -- 公有游标定义
END <package_name>;
一个范例的包和包体程序:
CREATE OR REPLACE PACKAGE pack_me IS
PROCEDURE order_proc (orno varchar2);
FUNCTION order_fun (ornos varchar2) RETURN varchar2;
END pack_me;
CREATE OR REPLACE PACKAGE BODY pack_me AS
/* 实现定义的存储过程 */
PROCEDURE order_proc (orno varchar2) IS
stst CHAR(1);
BEGIN
SELECT ostatus INTO stat FROM order_master
WHERE orderno = orno;
IF stat = 'p' THEN
DBMS_OUTPUT.PUT_LINE('暂挂的订单');
ELSE
DBMS_OUTPUT.PUT_LINE('已完成的订单');
END IF;
END order_proc;
/* 实现定义的函数 */
FUNCTION order_fun(ornos varchar2) RETURN varchar2 IS
icode varchar2(5);
ocode varchar2(5);
qtyord NUMBER;
qtydeld NUMBER;
BEGIN
SELECT qty_ord, qty_deld, itemcode, ordernc INTO qtyord, qtydeld, icode, ocode
FROM order_detail
WHERE orderno = ornos;
IF qtyord < qtydeld THEN
RETURN ocode;
ELSE
RETURN icode;
END IF;
END order_fun;
END pack_me;
要执行 pack_me包中的 order_proc过程,输入 EXECUTE pack_me.order_proc('o002');
要执行包中预定义的函数
DECLARE
msg varchar2(10);
BEGIN
msg := pack_me.order_fun('o002');
DBMS_OUTPUT.PUT_LINE('值是 ' || msg);
END;
ORACLE内置包的作用 :
1.扩展数据库的功能
2.为 PL/SQL 提供对 SQL 功能的访问
3.用户 SYS 拥有所有程序包,可以由任何用户访问
常用的系统包:
DBMS_ALERT支持数据库事件的异步通知
DBMS_STANDARD提供语言工具
DBMS_DDL某些DDL命令的PL/SQL等效项
CALENDAR提供日历维护功能
DBMS_LOB操纵ORACLE的LOB数据
DBMS_OUTPUT在SQL*PLUS或服务管理器中提供屏幕输出
DBMS_PIPE会话间异步通信
DBMS_ROWID允许从ROWID获得信息
DBMS_SESSIONALTER SESSION的PL/SQL等效项
DBMS_SQL动态PL/SQL和SQL