最近,由于开发的功能较多,对于编写的很多过程,看着英文名字觉得挺熟悉,但要看功能,则需要每个点开去开备注或者代码,觉得很是郁闷。突见packages,想将所有写的过程放到一起,这样下次点开一个,就能看到所有功能的过程,很是方便。趁着下午偶闲一会,将packages小做研究。
包的作用 : 包可以将任何出现在块声明的语句 ( 过程 , 函数 , 游标 , 变量 ) 放于包中 , 相当于一个容器 。 将声明语句放入包中的好处是 : 用户可以从其他 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 /* 游标 , 函数 , 过程的具体定义 */
包体是与包头相互独立的 , 包体只能在包头完成编译后才能进行编译 。 包体中带有包头中描述的子程序的具体实现的代码段 。 除此之外 , 包体还可以包括具有包体人全句属性的附加声明部分 , 但这些附加声明对于包头是不见的 。
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 包存储在服务器和客户端外 , 其他的包均存储在服务器中 。
在编译包的过程中,出现了如下的错误:
1、Error:PLS-00323: 子程序或游标 已在程序包说明中声明, 必须在程序包体中对其进行定义。
错误原因:包头里面定义的函数和包体里面函数的参数不同,出现的错误。
2、如果编译完成,在执行时,包是不会提示错误的,此时就需要自己来查找错误。我使用的方法是在过程中将sql调好之后再放到包中运行
分享到:
相关推荐
内含以下8个linux安装oracle数据库时需要用到的安装包 libaio-devel-0.3.105-2.i386.rpm libaio-0.3.105-2.i386.rpm libgcc-3.4.6-3.i386.rpm libstdc++-3.4.6-3.1.i386.rpm glibc-2.3.4-2.54.i686.rpm compat-...
在"Oracle-Built-In-Packages"这本书中,作者详细介绍了如何利用这些内置包来提升效率和性能。以下是书中的主要内容概览: **A. 伴侣光盘内容** 光盘中包含的资源可能是电子版的书籍、示例代码库或其他辅助学习...
《Oracle Database PL/SQL Packages and Types Reference 12c》是一本详细介绍了Oracle 12c数据库中PL/SQL语言特性的技术手册。该文档由多名Oracle专家共同编写而成,主要面向Oracle数据库管理员、开发人员以及其他对...
Oracle Built-in Packages原文,可以当手册使用,2010年出版的。
《Oracle PL/SQL Packages and Types Reference》是一本针对Oracle数据库编程的重要参考资料,主要涵盖了PL/SQL包和类型的详细信息。这本书对于那些具有英文阅读能力的开发者来说,是开发过程中的重要工具,能够帮助...
Oracle高级编程涉及使用包(Packages)来开发和部署数据库应用程序,这种技术在Oracle数据库中占有重要地位。包提供了一种组织和封装PL/SQL代码的方式,包括子程序、函数、变量、常量、异常和类型定义等。 包由两...
Oracle8i Supplied Java Packages Reference ...5. Oracle8i Supplied Java Packages Reference Release 3 (8.1.7) 对于开发者和使用者来说非常重要,因为它可以帮助他们更好地理解和使用 Oracle8i 中的 Java 包。
oracle中的SQL语句,其中的所有的SQL能干帮助大家更加容易的学习ORACLE。
这个“Oracle Solaris 10 Oracle Solaris108/11 Packages List-178”文档,正如其名,是一个包含了这两个版本中的软件包列表。这个列表对于系统管理员和 IT 专业人员来说至关重要,因为它提供了在这些操作系统上可用...
在Python编程环境中,与Oracle数据库进行交互通常会使用cx_Oracle这个第三方库。cx_Oracle是Python的一个接口,它允许Python程序直接访问Oracle数据库,执行SQL查询和存储过程。为了能够顺利地使用cx_Oracle,我们...
在Linux系统中,Oracle数据库的安装通常涉及到一系列的依赖包,尤其在离线环境中,确保所有依赖包都齐全显得尤为重要。本教程将详细介绍如何在CentOS 6上离线安装Oracle的所有依赖包。 首先,Oracle数据库对操作...
然后,修改 `/usr/lib/python2.4/site-packages/yum/yumRepo.py` 文件中的 remote 变量,例如: ``` remote = 'file:////home/demo/rhel5/Server' + '/' + relative ``` 3. 安装启动系统的添加/删除软件 使用 yum...
Oracle 9i 供给 Java 包参考手册Release 2(9.2)是 Oracle 公司发布的一份关于 Java 包的参考手册,该手册主要面向 Oracle 9i 数据库管理系统的开发者和管理员,旨在帮助他们更好地理解和使用 Oracle 供给的 Java ...
oracle db内部的package全部是加密的,需要解密使用oracle wrap加密过的程序包,而unwrap解密工具可以拿到明文的package源代码。 解密的理论依据都来源于 "The oracle hacker's handbook" by David Litchfield 这...
3. 安装完成后,cx_Oracle模块将被添加到Python的site-packages目录中,这样你就可以在Python脚本中通过`import cx_Oracle`来使用它。 在使用cx_Oracle时,你需要了解以下核心概念和操作: - 连接数据库:使用`cx_...
在Windows操作系统中,ROracle是用于在R编程环境中连接Oracle数据库的库。它提供了与Oracle数据库交互的功能,包括数据的读取、写入以及复杂的SQL查询操作。由于官方文档并未直接提供预编译的Windows版本,用户通常...
4. 在Python代码中,使用cx_Oracle连接Oracle数据库,如下所示: ```python import cx_Oracle connection = cx_Oracle.connect('username', 'password', 'localhost/oracle_service_name') cursor = connection....
### Toad for Oracle 使用手册关键知识点总结 #### 一、简介与新特性 - **Toad for Oracle**:是一款强大的数据库开发与管理工具,适用于Oracle数据库环境。 - **新版本特性**:概述了Toad for Oracle最新版本的...
《Oracle 8i Supplied PL/SQL Packages Reference》是Oracle官方为数据库管理员(DBA)和开发人员提供的一本权威指南。该书主要介绍了Oracle 8i版本中自带的大量PL/SQL包的功能与用法,帮助用户更高效地管理和维护...
下面是 Oracle8i Supplied PL/SQL Packages Reference Release 2 (8.1.6) 中的重要知识点: 1. Oracle 数据类型:Oracle8i 支持多种数据类型,包括数字、字符、日期、时间、interval 等。了解这些数据类型对于...