`
beliveAda
  • 浏览: 112562 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

oracle中packages的使用

 
阅读更多
最近,由于开发的功能较多,对于编写的很多过程,看着英文名字觉得挺熟悉,但要看功能,则需要每个点开去开备注或者代码,觉得很是郁闷。突见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调好之后再放到包中运行
分享到:
评论

相关推荐

    Oracle rpm Packages

    内含以下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

    在"Oracle-Built-In-Packages"这本书中,作者详细介绍了如何利用这些内置包来提升效率和性能。以下是书中的主要内容概览: **A. 伴侣光盘内容** 光盘中包含的资源可能是电子版的书籍、示例代码库或其他辅助学习...

    Oracle Database PLSQL Packages and Types Reference 12c

    《Oracle Database PL/SQL Packages and Types Reference 12c》是一本详细介绍了Oracle 12c数据库中PL/SQL语言特性的技术手册。该文档由多名Oracle专家共同编写而成,主要面向Oracle数据库管理员、开发人员以及其他对...

    Oracle Built-in Packages完整电子版

    Oracle Built-in Packages原文,可以当手册使用,2010年出版的。

    英文版Oracle PL/SQL Packages and Types Reference

    《Oracle PL/SQL Packages and Types Reference》是一本针对Oracle数据库编程的重要参考资料,主要涵盖了PL/SQL包和类型的详细信息。这本书对于那些具有英文阅读能力的开发者来说,是开发过程中的重要工具,能够帮助...

    Oracle Advanced Programming With Packages

    Oracle高级编程涉及使用包(Packages)来开发和部署数据库应用程序,这种技术在Oracle数据库中占有重要地位。包提供了一种组织和封装PL/SQL代码的方式,包括子程序、函数、变量、常量、异常和类型定义等。 包由两...

    Oracle8i Supplied Java Packages Reference Release 3 (8.1.7)

    Oracle8i Supplied Java Packages Reference ...5. Oracle8i Supplied Java Packages Reference Release 3 (8.1.7) 对于开发者和使用者来说非常重要,因为它可以帮助他们更好地理解和使用 Oracle8i 中的 Java 包。

    oracle中的SQL语句

    oracle中的SQL语句,其中的所有的SQL能干帮助大家更加容易的学习ORACLE。

    Oracle Solaris 10 Oracle Solaris108/11 Packages List-178

    这个“Oracle Solaris 10 Oracle Solaris108/11 Packages List-178”文档,正如其名,是一个包含了这两个版本中的软件包列表。这个列表对于系统管理员和 IT 专业人员来说至关重要,因为它提供了在这些操作系统上可用...

    cx_Oracle调用oracle所需驱动,

    在Python编程环境中,与Oracle数据库进行交互通常会使用cx_Oracle这个第三方库。cx_Oracle是Python的一个接口,它允许Python程序直接访问Oracle数据库,执行SQL查询和存储过程。为了能够顺利地使用cx_Oracle,我们...

    linux离线安装oracle所有依赖包

    在Linux系统中,Oracle数据库的安装通常涉及到一系列的依赖包,尤其在离线环境中,确保所有依赖包都齐全显得尤为重要。本教程将详细介绍如何在CentOS 6上离线安装Oracle的所有依赖包。 首先,Oracle数据库对操作...

    Linux下Oracle Client的安装

    然后,修改 `/usr/lib/python2.4/site-packages/yum/yumRepo.py` 文件中的 remote 变量,例如: ``` remote = 'file:////home/demo/rhel5/Server' + '/' + relative ``` 3. 安装启动系统的添加/删除软件 使用 yum...

    Oracle 9i Supplied Java Packages Reference Release 2 (9.2)

    Oracle 9i 供给 Java 包参考手册Release 2(9.2)是 Oracle 公司发布的一份关于 Java 包的参考手册,该手册主要面向 Oracle 9i 数据库管理系统的开发者和管理员,旨在帮助他们更好地理解和使用 Oracle 供给的 Java ...

    ORACLE 内置package解密工具(unwrap )

    oracle db内部的package全部是加密的,需要解密使用oracle wrap加密过的程序包,而unwrap解密工具可以拿到明文的package源代码。 解密的理论依据都来源于 "The oracle hacker's handbook" by David Litchfield 这...

    python2.7_cx_oracle

    3. 安装完成后,cx_Oracle模块将被添加到Python的site-packages目录中,这样你就可以在Python脚本中通过`import cx_Oracle`来使用它。 在使用cx_Oracle时,你需要了解以下核心概念和操作: - 连接数据库:使用`cx_...

    windows下ROracle的安装包

    在Windows操作系统中,ROracle是用于在R编程环境中连接Oracle数据库的库。它提供了与Oracle数据库交互的功能,包括数据的读取、写入以及复杂的SQL查询操作。由于官方文档并未直接提供预编译的Windows版本,用户通常...

    cx-Oracle安装必备oracle11g 64位 oci.dll

    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 使用手册关键知识点总结 #### 一、简介与新特性 - **Toad for Oracle**:是一款强大的数据库开发与管理工具,适用于Oracle数据库环境。 - **新版本特性**:概述了Toad for Oracle最新版本的...

    Oracle 8i Supplied PL/SQL Packages Reference

    《Oracle 8i Supplied PL/SQL Packages Reference》是Oracle官方为数据库管理员(DBA)和开发人员提供的一本权威指南。该书主要介绍了Oracle 8i版本中自带的大量PL/SQL包的功能与用法,帮助用户更高效地管理和维护...

    Oracle8i Supplied PL/SQL Packages Reference Release 2 (8.1.6)

    下面是 Oracle8i Supplied PL/SQL Packages Reference Release 2 (8.1.6) 中的重要知识点: 1. Oracle 数据类型:Oracle8i 支持多种数据类型,包括数字、字符、日期、时间、interval 等。了解这些数据类型对于...

Global site tag (gtag.js) - Google Analytics