Oracle的Package介绍

本文详细介绍了Oracle包的概念及其组成部分,包括包头和包体的创建方法,并通过实例展示了包的使用方式。此外,还讨论了包的重载规则及初始化过程,并列举了几个Oracle内置包的功能。

Oracle的Package介绍

ORACLE 包            

包的作用 : 包可以将任何出现在块声明的语句 ( 过程 , 函数 , 游标 , 游标 , 类型 , 变量 ) 放于包中 , 相当于一个容器 . 将声明语句放入包中的好处是 : 用户可以从其他 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 包存储在服务器和客户端外 , 其他的包均存储在服务器中 .


Oracle包(Package)是一组相关的程序单元(如过程、函数、变量等)的集合,部署Oracle包通常有以下方法: ### 方法一:使用SQL*Plus SQL*Plus 是 Oracle 提供的一个命令行工具,可以用来执行 SQL 脚本以部署包。 ```sql -- 登录到数据库 sqlplus username/password@database -- 执行包含包定义的 SQL 脚本 @/path/to/package_script.sql ``` 在 `package_script.sql` 文件中,通常包含包规范(Package Specification)和包体(Package Body)的定义,示例如下: ```sql -- 包规范定义 CREATE OR REPLACE PACKAGE my_package AS FUNCTION get_employee_name(emp_id NUMBER) RETURN VARCHAR2; END my_package; / -- 包体定义 CREATE OR REPLACE PACKAGE BODY my_package AS FUNCTION get_employee_name(emp_id NUMBER) RETURN VARCHAR2 IS emp_name VARCHAR2(100); BEGIN SELECT first_name || ' ' || last_name INTO emp_name FROM employees WHERE employee_id = emp_id; RETURN emp_name; END get_employee_name; END my_package; / ``` ### 方法二:使用 Oracle SQL Developer 1. 打开 Oracle SQL Developer 并连接到目标数据库。 2. 在“Connections”面板中,右键单击目标数据库连接,选择“Open SQL Worksheet”。 3. 将包规范和包体的 SQL 代码复制到 SQL Worksheet 中。 4. 点击“Run Script”按钮(绿色三角形图标)执行代码,完成包的部署。 ### 相关注意事项 - **权限问题**:执行包部署的用户需要具有 `CREATE PACKAGE` 和 `CREATE PACKAGE BODY` 系统权限。如果包中引用了其他对象,还需要对这些对象有相应的访问权限。 - **依赖关系**:确保包中引用的所有对象(如表、视图、其他包等)已经存在,并且权限正确。如果依赖的对象发生变化,可能需要重新编译包。 - **错误处理**:在部署过程中,如果出现错误,SQL*Plus 或 SQL Developer 会显示错误信息。需要仔细检查错误信息,定位问题所在,常见的错误包括语法错误、对象不存在等。 - **版本控制**:建议将包的 SQL 脚本纳入版本控制系统(如 Git),方便跟踪包的变更历史和进行版本管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值