《第13章--过程、函数和程序包课件.ppt》由会员分享,可在线阅读,更多相关《第13章--过程、函数和程序包课件.ppt(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包第第13章章 过程、函数和程序包过程、函数和程序包本章概述本章要点教学过程1Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包本章概述本章概述l前面章节涉及的程序块都是没有名称的。前面章节涉及的程序块都是没有名称的。这种没有名称的这种没有名称的PL/SQL程序块也可以称为程序块也可以称为匿名程序块。实际上,用户可以命名自己匿名程序块。实际上,用户可以命名自己编写的程序块,并将其存储起来,以便以编写的程序块,并将其存储起来,以便以后使用。这些命名的后使用。这些命名的PL/SQL程
2、序块称为存程序块称为存储过程和函数,他们的集合称为程序包。储过程和函数,他们的集合称为程序包。l本章介绍过程、函数和程序包等内容。本章介绍过程、函数和程序包等内容。2Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包本章要点本章要点l理解过程、函数和程序包的基本概念和特理解过程、函数和程序包的基本概念和特点点l学习在过程中使用输入和输出参数学习在过程中使用输入和输出参数l了解函数和过程的区别和联系了解函数和过程的区别和联系l理解程序包的结构理解程序包的结构l掌握程序包的规范掌握程序包的规范3Oracle Database 10g基础教程(第二版)第13章 过程
3、、函数和程序包教学过程教学过程13.1 概述概述 13.2 过程过程 13.3 函数函数 13.4 程序包程序包 4Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包13.1 概述概述l使用过程、函数和程序包代替使用过程、函数和程序包代替PL/SQL程序块由许多好处,例如,增程序块由许多好处,例如,增强可扩展性、提高模块化水平、可重用性增强、可维护性加强、有利强可扩展性、提高模块化水平、可重用性增强、可维护性加强、有利于抽象和数据隐藏、增强安全性等。于抽象和数据隐藏、增强安全性
4、等。l使用过程和函数可以允许开发人员增加新的功能,编写自己的例程,使用过程和函数可以允许开发人员增加新的功能,编写自己的例程,可以让用户灵活地扩展数据库的核心能力。这些改变并不是要改变可以让用户灵活地扩展数据库的核心能力。这些改变并不是要改变Oracle的工作方式,而是可以让用户建立附加的过程和函数。用户既的工作方式,而是可以让用户建立附加的过程和函数。用户既可以自己使用这些过程和函数,也可以与其他用户共享这些能力。可以自己使用这些过程和函数,也可以与其他用户共享这些能力。l许多开发人员都非常重视开发模块化代码。用户通过编写小型的、可许多开发人员都非常重视开发模块化代码。用户通过编写小型的、可
5、管理的过程,以便在用户应用中定义单独的处理模块,可以将其组织管理的过程,以便在用户应用中定义单独的处理模块,可以将其组织在一起形成复杂的应用。小型的、分离的过程远远比复杂的过程更容在一起形成复杂的应用。小型的、分离的过程远远比复杂的过程更容易修改,且可以被更加有效地共享。易修改,且可以被更加有效地共享。l由于这些例程命名后保存在数据库中,所以任何应用都能够执行它们由于这些例程命名后保存在数据库中,所以任何应用都能够执行它们(只要它们具有合适的权限只要它们具有合适的权限)。l使用过程、函数和程序包可以实现过程的抽象和数据的隐藏,例如,使用过程、函数和程序包可以实现过程的抽象和数据的隐藏,例如,假
6、设用户正在调用其他用户编写的假设用户正在调用其他用户编写的give_employee_raise()过程,用过程,用户通过向其提供一些数据来进行工作。户通过向其提供一些数据来进行工作。6Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包教学过程教学过程13.1 概述概述 13.2 过程过程 13.3 函数函数 13.4 程序包程序包 7Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包13.2 过程过程l从本质上来看,过程就是命名的从本质上来看,过程就是命名的PL/SQL程程序块,它可以被赋予参数并存储在数据库序块,它可以被赋
7、予参数并存储在数据库中,然后由另外一个应用或中,然后由另外一个应用或PL/SQL例程调例程调用。用。l下面详细介绍过程的创建、执行、安全、下面详细介绍过程的创建、执行、安全、使用参数等内容。使用参数等内容。8Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包示例示例10Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包执行过程执行过程 l创建过程之后即可执行过程。用户既可以从匿名创建过程之后即可执行过程。用户既可以从匿名PL/SQL程序块中直接
8、调用,也可以在程序块中直接调用,也可以在SQL*Plus中使用中使用execute()函数来执行。函数来执行。Execute()函数可函数可以简写为以简写为exec。l首先,使用匿名首先,使用匿名PL/SQL程序块执行过程。如图程序块执行过程。如图13-4所示的示例使用了匿名所示的示例使用了匿名PL/SQL程序块执行前程序块执行前面创建的面创建的my_proc过程。过程。l还可以使用还可以使用exec函数执行过程。相对来说,使用函数执行过程。相对来说,使用exec函数执行过程比使用匿名函数执行过程比使用匿名PL/SQL程序块调程序块调用用my_proc过程更快捷、方便。过程更快捷、方便。11O
9、racle Database 10g基础教程(第二版)第13章 过程、函数和程序包Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包参数传递参数传递 l前面的示例使用了前面的示例使用了p_parm=100方式传递方式传递参数。实际上,在参数。实际上,在Oracle系统中,可以使系统中,可以使用用3种方式传递参数,即:种方式传递参数,即:使用名称表示法使用名称表示法使用位置表示法使用位置表示法使用混合表示法使用混合表示法13Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包Oracle Database 10g基础教程(第二版)
10、第13章 过程、函数和程序包教学过程教学过程13.1 概述概述 13.2 过程过程 13.3 函数函数 13.4 程序包程序包 15Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包13.3 函数函数l函数与过程非常类似,也是数据库中存储函数与过程非常类似,也是数据库中存储的命名的命名PL/SQL程序块。创建函数与创建过程序块。创建函数与创建过程要都遵循同样的规则。函数与过程的安程要都遵循同样的规则。函数与过程的安全方式和参数传递也相同。函数的主要特全方式和参数传递也相同。函数的主要特征是它必须返回一个值。这个返回值既可征是它必须返回一个值。这个返回值既可以是
11、以是number或或varchar2这样简单的数据类这样简单的数据类型,也可以是型,也可以是PL/SQL数组或对象这样复杂数组或对象这样复杂的数据类型。的数据类型。16Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包返回值返回值 l定义过程和定义函数的主要区别之一是,定义函定义过程和定义函数的主要区别之一是,定义函数必须使用数必须使用return子句返回数据。在定义函数的子句返回数据。在定义函数的函数体的任何地方,用户都可以函数体的任何地方,用户都可以return;子句。需要
12、注意的是,这里的子句。需要注意的是,这里的expression表达式要等于表达式要等于return数据类型。数据类型。l如图如图13-25所示的是一个创建函数的示例。所示的是一个创建函数的示例。18Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包确定性确定性 l如果对于给定的输入,函数总是能够返回如果对于给定的输入,函数总是能够返回完全相同的结果,则称该函数具有确定性。完全相同的结果,则称该函数具有确定性。例如,例如,upper()函数具有确定性,如果向其函数具有确定性,如果向其输入输入Oracle Database 10g,那么它将返回,那么它将返回ORA
13、CLE DATABASE 10G。如果函数不。如果函数不能每次都返回相同的值,用户就不能将其能每次都返回相同的值,用户就不能将其作为确定性函数建立。作为确定性函数建立。l为了提示函数具有确定性,用户可以按照为了提示函数具有确定性,用户可以按照如图如图13-28所示的示例那样执行。所示的示例那样执行。19Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包常见错误常见错误 l实际上,用户在开发函数时,经常会遇到实际上,用户在开发函数时,经常会遇到下面的错误:忘记获取返回值;试图定义下面的错误:忘记获取返回值;试图定义不能返回值的函数;定义没有返回数据类不能返回值的
14、函数;定义没有返回数据类型的函数等。型的函数等。l了解这些错误的形式将会帮助用户避免这了解这些错误的形式将会帮助用户避免这些问题,并且可以在出现错误时快速修正些问题,并且可以在出现错误时快速修正它们。下面通过几个示例来介绍这些常见它们。下面通过几个示例来介绍这些常见的错误。的错误。20Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包教学过程教学过程13.1 概述概述 13.2 过程过程 13.3 函数函数 13.4 程序包程序包 21Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包13.4 程序包程序包lcreate or
15、 replace package package_namelauthid current_schema|definerlis|aslpragma serially_reusable;lcollection_type_definition lrecord_type_definitionlsubtype_definitionlcollection_declarationlconstant_declarationlexception_declarationlobject_declarationlrecord_declarationlvariable_declarationlcursor_speclf
16、unction_speclprocedure_speclcall_speclpragma restrict_references(assertions)lend package_name;22Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包规范规范 l程序包规范是程序包的接口。在规范中定程序包规范是程序包的接口。在规范中定义的所有内容都可以由调用者使用,并且义的所有内容都可以由调用者使用,并且可以由具有这个程序包的可以由具有这个程序包的execute权限的用权限的用户使用。在
17、规范中定义的过程可以被执行,户使用。在规范中定义的过程可以被执行,变量也可以被引用,类型也能够被访问。变量也可以被引用,类型也能够被访问。这些是程序包的公共特性。这些是程序包的公共特性。l在如图在如图13-32所示的示例中,将使用两个过所示的示例中,将使用两个过程程print_ename()和和print_sal(),定义一个,定义一个被称为被称为employee_pkg的程序包。的程序包。24Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包主体主体 l程序包主体是用户实际编写的子例程,用程序包主体是用户实际编写的子例程,用于实现规范中定义的接口。规范中显示
18、的于实现规范中定义的接口。规范中显示的所有过程和函数都必须在主体中实现。所有过程和函数都必须在主体中实现。l如图如图13-34所示的示例显示了如何实现所示的示例显示了如何实现employee_pkg程序包中的程序包中的print_ename过过程和程和print_sal过程。过程。25Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包程序包变量和其他声明程序包变量和其他声明 l用户可以定义程序包的全局变量。这些变量既可以定义在用户可以定义程序包的全局变量。这些变量既可以定义在程序包规范中,也可以定义在程序包的主体中。定义在规程序包规范中,也可以定义在程序包的主
19、体中。定义在规范中的那些变量可以像规范中的过程和函数一样被引用,范中的那些变量可以像规范中的过程和函数一样被引用,这些变量被称为公共变量。这些变量可以被任何具有程序这些变量被称为公共变量。这些变量可以被任何具有程序包的包的execute权限的用户进行读取和修改。在主体中定义权限的用户进行读取和修改。在主体中定义的程序包级别的变量只能由主体中的过程实现来访问,这的程序包级别的变量只能由主体中的过程实现来访问,这些变量被称为私有变量。些变量被称为私有变量。l程序包级别的变量与过程和函数中的局域变量不同,它们程序包级别的变量与过程和函数中的局域变量不同,它们会在数据库会话期间保持其的状态。这意味着,用户可以会在数据库会话期间保持其的状态。这意味着,用户可以使用一次调用设置一个全局变量,以完成一些工作,然后使用一次调用设置一个全局变量,以完成一些工作,然后返回,并且在过程执行时再次调用它的值,然后离开。返回,并且在过程执行时再次调用它的值,然后离开。26Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包
限制150内