PL-SQL 包的创建和应用



①简介

包是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。

包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。

把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。

与类相同,包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同,即它们的作用域不同。

公用元素不仅可以被包中的函数、过程所调用,也可以被包外的PL/SQL程序访问,而私有元素只能被包内的函数和过程序所访问。

在PL/SQL程序设计中,使用包不仅可以使程序设计模块化,对外隐藏包内所使用的信息(通过使用私用变量),而且可以提高程序的执行效率。

因为,当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,

从而使程序执行效率得到提高。

一个包由两个分开的部分组成:

包定义(PACKAGE):包定义部分声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。

包主体(PACKAGE BODY):包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在包主体中还可以声明包的私有元素。

包定义和包主体分开编译,并作为两部分分开的对象存放在数据库字典中,详见数据字典user_source, all_source, dba_source.

②包的定义

包定义的语法如下:

1.创建包定义:

CREATE[OR REPLACE] PACKAGE package_name

[AUTHID {CURRENT_USER | DEFINER}]

{IS| AS}

[公有数据类型定义[公有数据类型定义]…]

[公有游标声明[公有游标声明]…]

[公有变量、常量声明[公有变量、常量声明]…]

[公有子程序声明[公有子程序声明]…]

END[package_name];

其中:AUTHID CURRENT_USER和AUTHID DEFINER选项说明应用程序在调用函数时所使用的权限模式,

它们与CREATE FUNCTION语句中invoker_right_clause子句的作用相同。

创建包主体:

CREATE[OR REPLACE] PACKAGE BODYpackage_name

{IS| AS}

[私有数据类型定义[私有数据类型定义]…]

[私有变量、常量声明[私有变量、常量声明]…]

[私有子程序声明和定义[私有子程序声明和定义]…]

[公有游标定义[公有游标定义]…]

[公有子程序定义[公有子程序定义]…]

BEGIN

PL/SQL 语句

END[package_name];

其中:在包主体定义公有程序时,它们必须与包定义中所声明子程序的格式完全一致。

对包内共有元素的调用格式为:包名.元素名称

③子程序重载

PL/SQL 允许对包内子程序和本地子程序进行重载。

所谓重载时指两个或多个子程序有相同的名称,但拥有不同的参数变量、参数顺序或参数数据类型。

④删除包

可以使用DROP PACKAGE命令对不需要的包进行删除,语法如下:

DROP PACKAGE [BODY] [user.]package_name;

⑤包的管理

DBA_SOURCE, USER_SOURCE, USER_ERRORS, DBA-OBJECTS

⑥例子:

创建的包为demo_pack, 该包中包含一个记录变量DeptRec、两个函数和一个过程。

CREATE OR REPLACE PACKAGE demo_pack

IS

DeptRec dept%ROWTYPE;

FUNCTION add_dept(dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)

RETURN NUMBER;

FUNCTION remove_dept(dept_no NUMBER)

RETURN NUMBER;

PROCEDURE query_dept(dept_no IN NUMBER);

END demo_pack

包主体的创建方法,它实现上面所声明的包定义

CREATE OR REPLACE PACKAGE BODY demo_pack

IS

--函数定义

FUNCTION add_dept(dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)

RETURN NUMBER

IS

empno_remaining EXCEPTION;

PRAGMA EXCEPTION_INIT(empno_remaining, -1);

/* -1 是违反唯一约束条件的错误代码*/

BEGIN

INSERT INTO dept VALUES(dept_no, dept_name, location);

IF SQL%FOUND THEN

RETURN 1;

END IF;

EXCEPTION

WHEN empno_remaining THEN

RETURN 0;

WHEN OTHERS THEN

RETURN -1;

END add_dept;

--函数定义

FUNCTION remove_dept(dept_no NUMBER)

RETURN NUMBER

IS

BEGIN

DELETE FROM dept WHERE deptno=dept_no;

IF SQL%FOUND THEN

RETURN 1;

ELSE

RETURN 0;

END IF;

EXCEPTION

WHEN OTHERS THEN

RETURN -1;

END remove_dept;

--过程定义

PROCEDURE query_dept(dept_no IN NUMBER)

IS

BEGIN

SELECT * INTO DeptRec FROM dept WHERE deptno=dept_no;

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE(‘数据库中没有编码为‘||dept_no||‘的部门‘);

WHEN TOO_MANY_ROWS THEN

DBMS_OUTPUT.PUT_LINE(‘程序运行错误!请使用游标‘);

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||’----‘||SQLERRM);

END query_dept;

BEGIN

Null;

END demo_pack;

时间: 2024-10-15 01:33:17

PL-SQL 包的创建和应用的相关文章

(十三)PL/SQL包

PL/SQL包是组逻辑相关的PL/SQL类型,变量和子程序模式对象.程序包将有两个强制性的部分: 1.包装规范定义 2.包体或定义 一.包装规范定义规范是接口到包.它只是声明的类型,变量,常量,异常,游标和子程序可从封装外部引用.换句话说,它包含关于包的内容的所有信息,但不包括用于子程序的代码.置于规范的所有对象被称为公共对象.任何子程序在封装主体中没有包定义但编码被称为私有对象. 下面的代码片段显示了具有单一的程序包规范定义.一个包中可以定义的全局变量和多个程序或函数. CREATE PACK

PL/SQL 包的概念及创建使用

包1:概念包是一组过程.函数.变量.常量和游标等元素的组合.是对这些PL/SQL 程序设计元素的封装.其中变量相当于类中的成员变量,过程和函数相当于类方法.把相关的模块归类成包,可使开发人员利用面向对象的方法进行存储过程的开发.2:包的组成部分: (1)包定义(PACKAGE):包定义部分声明包内数据类型.变量.常量.游标.子程序和异常错误处理等元素,这些元素为包的公有元素. (2)包主体(PACKAGE BODY):包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在包主

PL/SQL包(Package)

包(Package)的主要作用是用于逻辑组合相关的PL/SQL类型,一旦创建了包,包就会被存储在Oracle数据库中. 包由以下两部分组成: (1)包规范(Specification):主要是包的一些定义信息,不包含具体的实现,包含类型(type),记录(record),变量(variable),常量(constant),异常(exception)定义,游标(cursor)和子程序(function or procedure)的声明. (2)包体(Body):包体是对包规范中声明的子程序的实现部

oracle PL/SQL 包的介绍(四)

PL/SQL 的包1.逻辑相关的组件的组合 (变量,数据结构,异常,存储过程,函数)2.组成 : 定义 和 包体 -- 组成包头 : PUBLIC 包体 : PRIVATE -- 包头的语法   1 CREATE OR REPLACE PACKAGE package_name IS|AS 2 PUBLIC TYPE AND VARIABLE declarations 3 subprogram specifications 4 END [package_name]; --实例 1 CREATE O

oracle pl/sql 包

包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成.1).我们可以使用create package命令来创建包,如:i.创建一个包sp_packageii.声明该包有一个过程update_saliii.声明该包有一个函数annual_income --声明该包有一个存储过程和一个函数create package sp_package is procedure update_sal(name varchar2, newsal number); function annual_income(n

[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天才在于积累!) ——通过知识共享树立个人品牌.   继上七篇:            [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)            [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之

Oracle数据库之开发PL/SQL子程序和包

Oracle数据库之开发PL/SQL子程序和包 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据库中,以便共享. 过程和函数均存储在数据库中,并通过参数与其调用者交换信息.过程和函数的唯一区别是函数总向调用者返回数据,而过程不返回数据. 1. 存储过程概念 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中.经过第一次编译后

oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包(转)

匿名PL/SQL块回顾 DECLARE (可选)     定义在PL/SQL块中要使用的对象 BEGIN (必须)     执行语句 EXCEPTION (可选)     错误处理语句 END; (必须) 匿名块(以DECLARE或BEGIN开始)每次使用时都要进行编译. 匿名块不存储在数据库中,并且它不能从其它的PL/SQL块中进行调用. 过程.函数.包和触发器:都是带名块.(请注重同匿名块的比较) 过程.函数.包和触发器:可以存储在数据库中,并且可以在需要的时候运行. 过程.函数.包和触发器

PL/SQL之--包

一.包 包是一组相关过程.函数.常量.变量.游标.异常等PL/SQL程序设计元素的组合.它类似于C++和Java中的类,其中变量相当于类中的成员变量,过程和函数相当于类中的方法.通过使用包,可以使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统的性能. 包的结构如下: 一个包由包头和包主体组成: 包头(package):包头部分声明包内数据类型.变量.常量.游标.子程序(只有声明)和异常错误处理等元素,这些元素为包的共有元素. 包主体(package body):包主体则是包定义部分的

Oracle中PL/SQL简介、基本语法以及数据类型

Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控制为一体的强大语言,PL/SQL不但支持更多的数据类型,拥有自身的变量申明,赋值语句,而且还有条件,循环等流程控制语句.过程控制结构与SQL数据处理能力无缝的结合形成了强大的编程语言,可以创建过程和函数以及程序包. PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性的发送给服务器,由服