数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle的Package的作用及用法


发布日期:2024年04月05日
 
Oracle的Package的作用及用法

公司需求知识自学Oracle的Package的作用及用法

简化应用设计提高应用性能实现信息隐藏子程序重载

Oracle的Package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)?

你不觉得把存储过程分门别类是很重要的么而且不同的package的存储过程可以重 名

用package不仅能把存储过程分门别类而且在package里可以定义公共的变量/类型既方便了编程又减少了服务器的编译开销

如何把现有的存储过程加入到Package中?

copy and pasty不过调用的时候要带包名了

除了使用SQL Plus还有没有什么工具做Package?

也有方便的第三方工具了不过得自己找了

用第三方工具吧比如sql navigator

使用SQL Plus编译Package是否每次都是编译Package中所有的存储过程?

是包也是一种命名pl/sql块和存储过程函数一下都是在数据库启动的时候就载入内存的开销的大小很难判断因为你不用包但是要完成包的功能的话还是要用PL/SQL来完成的服务器一样有开销相对来说用包少了SQL的语法分析解释过程开销还少一点

过程一般都不超过那我倒很少遇到用不用子过程关键要看是不是能定义可重用的子过程用子过程效率不会低

包的作用:包可以将任何出现在块声明的语句(过程函数游标游标类型变量)放于包中相当于一个容器将声明语句放入包中的好处是:用户可以从其他PL/SQL块中对其进行引用因此包为PL/SQL提供了全程变量

包分为两部分:包头和包体

如何创建包?

)包头:

语法格式:

CREATE OR REPLACE PACKAGEpackage_name /*包头名称*/

IS|AS pl/sql_package_spec /*定义过程函数以及返回类型变量常量及数据类型定义*/

定义包头应当遵循以下原则:

)包元素位置可以任意安排然而在声明部分对象必须在引用前进行声明

)包头可以不对任何类型的元素进行说明例如包头可以只带过程和函数说明语句而不声明任何异常和类型

)对过程和函数的任何声明都必须只对子程序和其参数进行描述不能有任何代码的说明代码的实现只能在包体中出现它不同于块声明在块声明中过程和函数的代码可同时出现在声明部分

包体:

语法格式:

CREATE OR REPLACE PACKAGE BODY package_name/*包名必须与包头的包名一致*/

IS | AS pl/sql_package_body /*游标函数过程的具体定义*/

包体是与包头相互独立的包体只能在包头完成编译后才能进行编译包体中带有包头中描述的子程序的具体实现的代码段除此之外包体还可以包括具有包体人全句属性的附加声明部分但这些附加声明对于包头是不见的

EG:定义一个包头

CREATE OR REPLACE PACKAGE select_table

IS

TYPE tab_ IS RECORD

(

itnum_ varchar()

itnum_ varchar()

);

TYPE tab_ IS RECORD

(

itnum_ varchar()

itnum_ varchar()

itnum_ varchar()

);

TYPE tab_ IS RECORD

(

itnum_ varchar()

itnum_ varchar()

itnum_ varchar()

itnum_ varchar()

);

TYPE tab_ IS RECORD

(

itnum_ varchar()

itnum_ varchar()

itnum_ varchar()

itnum_ varchar()

itnum_ varchar()

);

TYPE tab_ IS RECORD

(

itnum_ varchar()

itnum_ varchar()

itnum_ varchar()

itnum_ varchar()

itnum_ varchar()

itnum_ varchar()

);

TYPE cur_ IS REF CURSOR RETURNtab_;

TYPE cur_ IS REF CURSOR RETURNtab_;

TYPE cur_ IS REF CURSOR RETURNtab_;

TYPE cur_ IS REF CURSOR RETURNtab_;

TYPE cur_ IS REF CURSOR RETURNtab_;

END select_tab;

EG:

CREATE OR REPLACE PACKAGE test_package

IS

FUNCTION average

(cnum IN char)

RETURN NUMBER;

PRODURE student_grade

(CUR OUT select_tablecur_);CUR的数据类型是select_table包中cur_o

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 BYKCH;

RETURN(avger);

END average;

/*函数实现结束*/

/*过程实现开始*/

PRODURE student_grade

(CUR OUT select_tablecur_);

AS

OPEN CUR FOR

SELECT XSXH XSXMKCKCMXS_KCCJ

FROM XS XS_KCKC

WHERE XSXH =XS_KCXH AND XS_KCKCH=KCKCH;

END student_grade;

/*过程实现结束*/

END test_package;

重载:包中的函数和过程可以重载

以下条件不能重载:

如果两个子程序的参数仅在名称和类型上不同这两个程序不能重载

PROCEDURE overloadME(p_theparameterIN number);

PROCEDURE overloadME(p_theparameterOUT number);

IN OUT为参数类型number为数据类型两个过程仅在类型上不同时不能重载

不能根据两个函数的返回类型对其重载

如:

FUNCTION overloadMeETooRETURN DATE;

FUNCTION overloadMeETooRETURN NUMER;

重载子程序的参数的类族必须不同例如由于CHAR和VARCHAR属性同一类族所以不能重载

PROCEDURE overloadME(p_theparameterIN char);

PROCEDURE overloadME(p_theparameterIN varchar);

打包子程序也可以重载

包的初始化

当第一次调用打包子程序时该包将进行初始化也就是说将该包从硬盘中读入到内存并启用调用的子程序的编译代码这时系统为该包中定义的所有变量分配内存单元每个会话都有打其打开包变量的副本以确保执行同一个包子程序的两个会话使用不同的内存单元

在大多数情况下初始化代码要在包第一次初始化时运行为了实现这一功能可以在包体中的所有对象之后加入一个初始化代码

语法格式:

CREATE OR REPLACE PACKAGE BODYpackage_name

IS|AS

BEGIN

Initialization_code;要运行的初始化代码

END ;

ORACLE 内置包

DBMS_ALERT包:用于数据库报警允许会话间通信

DBMS_JOB:用于任务调度服务

DBMS_LOB:用于处理大对象操作

DBMS_PIPE包:用于数据库管道允许会话间通信

DBMS_SQL包:用于执行动态SQL

UTL_FILE包:用于文件的输入输出

除了UTL_FILE包存储在服务器和客户端外其他的包均存储在服务器中

上一篇:.NET框架下从Oracle到SQL Server的迁移

下一篇:在Oracle中实现数据库的复制