`
insertyou
  • 浏览: 906232 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

PL/SQL --> 包的创建与管理

 
阅读更多

--============================

-- PL/SQL --> 包的创建与管理

--============================

包,是一个逻辑集合,是由PL/SQL类型以及PL/SQL子程序的集合。PL/SQL类型包括table类型,record类型。PL/SQL项则包括游标,游标

变量。PL/SQL子程序包括过程,函数等。可以说包可谓是包罗万象。是所有PL/SQL相关资源的汇总。

包的使用可以简化应用程序设计,实现信息掩藏,子程序重载等功能。

包的优点

1.模块化:将函数,子程序全部融合在一起,使得成为一个有机的整体,封装了相关的结构。

2.易于维护:整合了子程序,更易于维护

3.简化应用程序设计:包的声明与包体内容相分离。

4.隐藏信息:私有对象不可访问,所有的包体内代码可以实现隐藏。

5.节省I/O:一次编译,多次使用。

一、包的组成与创建语法

包头:用于定义包的公共组件,如函数头,过程头,游标等以及常量,变量等。包头中定义的公共组件可以在包内引用,也可以被其

它子程序引用。

包体:用于定义包头中定义过的过程和函数。可以单独定义私有组件,包括变量,常量,过程和函数等。私有组件只能在包内使用,而

不能被其它子程序所调用。

一言以蔽之,包头定义包的声明及描述部分,而包体则定义了对应包的具体执行部分。

创建包的语法:

CREATE [OR REPLACE] PACKAGE package_name --定义包头

{AS|IS}

public_variable_declarations |

public_type_declarations |

public_exception_declarations |

public_cursor_declarations |

function_declarations |

procedure_specifications

END [package_name]

CREATE [OR REPLACE] PACKAGE BODY package_name --定义包体,包体中的package_name应当与包头中的package_name相同

{AS|IS}

private_variable_declarations |

private_type_declarations |

private_exception_declarations |

private_cursor_declarations |

function_declarations |

procedure_specifications

END [package_name]

二、创建包

下面演示包的创建,基于用户scott创建,存储过程,函数等依赖于其下的对象

1.创建包头

CREATE OR REPLACE PACKAGE emp_package IS --创建包头,包的名字为emp_package

g_deptno NUMBER(3) := 30; --定义一个公共变量g_deptno

PROCEDURE add_employee(eno NUMBER, name VARCHAR2, salary NUMBER, dno NUMBER DEFAULT g_deptno); --声明过程

PROCEDURE fire_employee(eno NUMBER); --声明过程

FUNCTION get_sal(eno NUMBER) RETURN NUMBER; --声明函数

END emp_package;

/

2.创建包体

CREATE OR REPLACE PACKAGE BODY emp_package IS --创建包体,注意,包体中包的名字必须与包头的名字相一致

FUNCTION validate_deptno(v_deptno NUMBER) RETURN BOOLEAN --创建一个私有函数,,此私有函数不能该包外子程序调用

IS

v_temp INT;

BEGIN

SELECT 1 INTO v_temp FROM dept WHERE deptno = v_deptno;

RETURN TRUE;

EXCEPTION

WHEN NO_DATA_FOUND THEN

RETURN FALSE;

END;

PROCEDURE add_employee --创建添加雇员的过程

(eno NUMBER, name VARCHAR2, salary NUMBER, dno NUMBER DEFAULT g_deptno) IS

BEGIN

IF validate_deptno(dno) THEN --该过程调用了包内的一个函数validate_deptno来验证dno的有效性

INSERT INTO emp(empno, ename, sal, deptno) VALUES(eno, name, salary, dno);

ELSE

RAISE_APPLICATION_ERROR(-20000, '不存在该部门');

END IF;

EXCEPTION

WHEN DUP_VAL_ON_INDEX THEN

RAISE_APPLICATION_ERROR(-20011, '该雇员已存在');

END;

PROCEDURE fire_employee(eno NUMBER) IS --创建解除雇员的过程

BEGIN

DELETE FROM emp WHERE empno = eno;

IF SQL%NOTFOUND THEN

RAISE_APPLICATION_ERROR(-20012, '该雇员不存在');

END IF;

END;

FUNCTION get_sal(eno NUMBER) RETURN NUMBER IS --创建函数get_sal返回雇员的薪水

v_sal emp.sal%TYPE;

BEGIN

SELECT sal INTO v_sal FROM emp WHERE empno = eno;

RETURN v_sal;

EXCEPTION

WHEN NO_DATA_FOUND THEN

RAISE_APPLICATION_ERROR(-20012, '该雇员不存在');

END;

END emp_package;

/

3.创建仅包含包头的包(仅包含包头的包也可以被调用,具体参照后面的包的调用)

CREATE OR REPLACE PACKAGE global_int

IS

g_positive CONSTANT NUMBER:=10;

g_negative CONSTANT NUMBER:=-10;

END global_int;

三、包的调用

对于包的私有对象只能在包内调用。如上面的例子中对包内私有函数validate_deptno进行了直接调用

对于包的公共对象,既可以在包内调用,也可以由其他应用程序调用。使用其他应用程序调用时的方法:包名.包对象

1.调用包的公共变量

scott@ORCL> exec emp_package.g_deptno:=10;

2.调用包的公共过程

scott@ORCL> exec emp_package.add_employee(2222,'Robinson',3000); --此调用未指定部门号,则使用缺省值,但前面执行了

--exec emp_package.g_deptno:=10;故部门号变为

scott@ORCL> exec emp_package.add_employee(3333,'Jackson',4000,20);

scott@ORCL> select * from emp where empno in(2222,3333);

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

2222 Robinson 3000 10

3333 Jackson 4000 20

3.调用包的公共函数

scott@ORCL> var sal number

scott@ORCL> exec :sal:=emp_package.get_sal(7788);

PL/SQL procedure successfully completed.

scott@ORCL> print sal

SAL

----------

310

4.以不同用户身份调用包.需要使用schema名字来调用,即:用户名.包名.包对象名

scott@ORCL> conn lion/lion --注意帐户需要具有执行所调用包的权限

lion@ORCL> exec scott.emp_package.fire_employee(2222);

5.调用远程数据库包的公共对象。调用方法:包名.包对象名@数据库链接名

sys@ASMDB> create database link orcl

2 connect to lion identified by lion

3 using 'orcl';

Database link created.

sys@ASMDB> exec scott.emp_package.add_employee@orcl(4444,'Richard',4000);

BEGIN scott.emp_package.add_employee@orcl(4444,'Richard',4000); END;

*

ERROR at line 1:

ORA-06550: line 1, column 7: --注意远程调用时,对于缺省的参数不适用,需要明确指定参数

PLS-00424: RPC defaults cannot include Package State

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

sys@ASMDB> exec scott.emp_package.add_employee@orcl(4444,'Richard',4000,20); --下面的调用被成功执行

PL/SQL procedure successfully completed.

6.无包体包的调用(使用前面创建的包global_int)

scott@ORCL> BEGIN

2 DBMS_OUTPUT.PUT_LINE('Result is : '||2*global_int.g_positive); --使用包DBMS_OUTPUT来调用

3 END;

4 /

Result is : 20

PL/SQL procedure successfully completed.

scott@ORCL> CREATE OR REPLACE FUNCTION f_negative(m number) --将包嵌入到函数之中

2 RETURN NUMBER

3 IS

4 BEGIN

5 RETURN(m*global_int.g_negative);

6 END f_negative;

7 /

Function created.

scott@ORCL> EXEC DBMS_OUTPUT.PUT_LINE(f_negative(2));

-20

PL/SQL procedure successfully completed.

四、包的管理

1.查看包

scott@ORCL> select line,text from user_source --查看包头

2 where name='EMP_PACKAGE' and type='PACKAGE';

LINE TEXT

---------- ------------------------------------------------------------

1 PACKAGE emp_package IS

2 g_deptno NUMBER(3) := 30;

3 PROCEDURE add_employee(eno NUMBER, name VARCHAR2, salary N

UMBER, dno NUMBER DEFAULT g_deptno);

4 PROCEDURE fire_employee(eno NUMBER);

5 FUNCTION get_sal(eno NUMBER) RETURN NUMBER;

6 END emp_package;

scott@ORCL> select line,text from user_source --查看包体

2 where name='EMP_PACKAGE' and type='PACKAGE BODY';

LINE TEXT

---------- --------------------------------------------------------------------------------

1 PACKAGE BODY emp_package IS

2 FUNCTION validate_deptno(v_deptno NUMBER) RETURN BOOLEAN IS

3 v_temp INT;

4 BEGIN

5 SELECT 1 INTO v_temp FROM dept WHERE deptno = v_deptno;

6 RETURN TRUE;

......................

2.查看包的参数

scott@ORCL> desc emp_package;

PROCEDURE ADD_EMPLOYEE

Argument Name Type In/Out Default?

------------------------------ ----------------------- ------ --------

ENO NUMBER IN

NAME VARCHAR2 IN

SALARY NUMBER IN

DNO NUMBER IN DEFAULT

PROCEDURE FIRE_EMPLOYEE

Argument Name Type In/Out Default?

------------------------------ ----------------------- ------ --------

ENO NUMBER IN

FUNCTION GET_SAL RETURNS NUMBER

Argument Name Type In/Out Default?

------------------------------ ----------------------- ------ --------

ENO NUMBER IN

3.包的删除

DROP PACKAGE package_name --同时删除包体和包头

scott@ORCL> DROP PACKAGE global_int;

删除包体,保留包头

DROP PACKAGE BODY package_name --删除包体

scott@ORCL> drop package body emp_package;

Package body dropped.

4.包的编译

重新编译包规范和包体:alter package...compile
重新编译包规范:alter package...compile specification
重新编译包体:alter package...compile body

五、总结

创键包体之前应该先创建包头

包头应当仅仅包含那些希望作为公共对象的部分

包头的声明应包含尽可能少的结构信息

任意包头的变更,需要重新编译该包内的子程序

在包头内定义的任意公共对象可以被任意内部或外部子程序调用

包体内的私有对象仅仅能被该包体内的子程序调用

六、更多参考

有关SQL请参考

SQL 基础--> 子查询

SQL 基础-->多表查询

SQL基础-->分组与分组函数

SQL 基础-->常用函数

SQL 基础--> ROLLUP与CUBE运算符实现数据汇总

SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)

有关PL/SQL请参考

PL/SQL --> 语言基础

PL/SQL --> 流程控制

PL/SQL --> 存储过程

PL/SQL --> 函数

PL/SQL --> 游标

PL/SQL -->隐式游标(SQL%FOUND)

PL/SQL --> 异常处理(Exception)

PL/SQL --> PL/SQL记录

PL/SQL --> 包的创建与管理

PL/SQL --> 包重载、初始化

PL/SQL --> DBMS_DDL包的使用

PL/SQL --> DML 触发器

PL/SQL --> INSTEAD OF 触发器

分享到:
评论

相关推荐

    Web pl/sql报表制作过程

    - 在系统管理员的应用功能设置中,创建一个新的功能,关联之前注册的PL/SQL程序包,并设置相应的属性,如功能名称、用户功能名称、类型(SSWA PLSQL 函数)、支持维护模式(无)和上下文(责任)。 5. **注册菜单*...

    Oracle-PL/SQL-windows-32位-客户端

    Oracle PL/SQL是Oracle数据库与开发人员之间交互的重要工具,特别是在Windows 32位系统上。这个压缩包“Oracle-PL/SQL-windows-32位-客户端”包含了Oracle数据库32位客户端所需的组件,主要用于在Windows环境下进行...

    oracle10g_pl/sql

    Oracle 10g PL/SQL 是Oracle数据库系统中用于创建和管理存储过程、函数、触发器等数据库对象的编程语言。本教程旨在为初学者提供一个全面的学习平台,同时也为经验丰富的开发者提供参考资料。PL/SQL是Oracle特有的...

    PL/SQL 基本知识

    例如,在`jbpm.sql`文件中,可能包含了与业务流程管理(BPM)相关的PL/SQL存储过程或函数,用于定义和执行工作流任务。 此外,PL/SQL还支持块的概念,如匿名块,这使得在不创建独立的存储过程或函数的情况下,也能...

    pl/sql最新中文手册

    手册会介绍如何在PL/SQL块中使用DML语句,并处理事务管理。 5. **游标**:游标是PL/SQL中处理单行结果集的关键工具。手册将说明如何声明、打开、读取和关闭游标,以及如何在循环中使用它们。 6. **复合类型**:PL/...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    PL/SQL是Oracle数据库特有的编程语言,它结合了SQL的查询能力与过程式编程语言的功能,使得数据库管理、数据处理和业务逻辑实现更为高效。本书针对那些希望提升PL/SQL编程技能,设计和开发复杂数据库解决方案的...

    Oracle PL/SQL实战(待续)

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...

    Oracle资料学习PL/SQL必备

    PL/SQL(Procedural Language/Structured Query Language)是Oracle专为数据库操作设计的一种过程化编程语言,结合了SQL的强大查询功能与高级编程语言的控制结构,使得数据库管理员和开发人员能够更高效、安全地管理...

    PL/SQL Developer V7.1.5汉化包

    PL/SQL Developer是一款专为Oracle数据库设计的集成开发环境(IDE),它由Allround Automations公司开发,主要用于编写、调试、测试和管理PL/SQL代码。V7.1.5是该软件的一个版本,提供了对PL/SQL语言的强大支持,...

    12oracle的PL/SQL编程-函数.包.触发器 PPT

    本文将深入探讨PL/SQL中的三个关键概念:函数、包和触发器,以及它们在Oracle数据库系统中的应用。 ### 1. 函数(Functions) 函数是PL/SQL中可重用的代码单元,它们接收输入参数,执行计算或操作,并返回一个结果...

    oracle 9i pl/sql程序设计笔记

    此匿名块展示了如何使用PL/SQL声明变量、插入数据到表中以及使用`DBMS_OUTPUT`包在屏幕上显示数据。值得注意的是,为了使`DBMS_OUTPUT.PUT_LINE`函数生效,需要确保服务器输出(Server Output)已开启,可通过命令`...

    pl/sql 免安装,绿色版pl/sql

    7. **版本控制集成**:对于团队协作,PL/SQL Developer支持与各种版本控制系统(如SVN、Git等)集成,便于代码版本管理和协同工作。 8. **readme文档**:压缩包内的readme文档提供了详细的配置和使用指南,帮助新...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    oracle pl/sql从入门到精通 配套源代码

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作功能与PL/SQL的程序设计特性,广泛应用于Oracle数据库的开发和管理。这本书"Oracle PL/SQL从入门到精通"的配套源代码,显然是为了...

    PL/SQL编程基础知识

    - **程序包**:集合了一系列相关的子程序、类型定义和其他PL/SQL元素,便于管理和复用。 **2.3 标识符规则** PL/SQL中的标识符遵循以下规则: - 标识符长度不能超过30个字符。 - 第一个字符必须是字母。 - 不区分...

    PL/SQL安装包

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL与过程编程的语言,用于在Oracle环境中开发数据库应用程序。PL代表Procedural Language,SQL则代表Structured Query Language。这个"PL/SQL安装包...

    pl/sql学习笔记

    PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库中的过程式编程语言,它结合了SQL查询语句和传统的过程式编程元素,使得在数据库管理中进行复杂逻辑处理成为可能。以下是对PL/SQL的学习笔记...

    pl/sql 学习资料

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL语言与过程式编程的高级语言,主要用于数据库管理和应用程序开发。在这个“PL/SQL学习资料”压缩包中,包含了十一个PDF文件,覆盖了从基础到进阶的...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    PL/SQL是Oracle专为数据库管理设计的一种过程化编程语言,它结合了SQL查询语言的威力与高级编程语言的灵活性,使得数据库开发者能够创建复杂的应用程序逻辑。 在"Oracle Database 12c PL/SQL开发指南(第7版)"这...

    Oracle PL/SQL学习官方教材

    11. **数据库对象的动态SQL**:通过EXECUTE IMMEDIATE和DBMS_SQL包,可以执行动态SQL,允许在运行时构建和执行SQL语句,提高了灵活性。 12. **数据库链接**:了解如何使用数据库链接(Database Links)在不同数据库...

Global site tag (gtag.js) - Google Analytics