资源预览内容
第1页 / 共27页
第2页 / 共27页
第3页 / 共27页
第4页 / 共27页
第5页 / 共27页
第6页 / 共27页
第7页 / 共27页
第8页 / 共27页
第9页 / 共27页
第10页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包第13章 过程、函数和程序包本章概述本章要点教学过程1Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包本章概述l前面章节涉及的程序块都是没有名称的。 这种没有名称的PL/SQL程序块也可以称为 匿名程序块。实际上,用户可以命名自己 编写的程序块,并将其存储起来,以便以 后使用。这些命名的PL/SQL程序块称为存 储过程和函数,他们的集合称为程序包。l本章介绍过程、函数和程序包等内容。 2Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包本章要点l理解过程、函数和程序包的基本概念和特 点l学习在过程中使用输入和输出参数l了解函数和过程的区别和联系l理解程序包的结构l掌握程序包的规范3Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包教学过程13.1 概述 13.2 过程 13.3 函数 13.4 程序包 4Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包教学过程13.1 概述 13.2 过程 13.3 函数 13.4 程序包 5Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包13.1 概述l使用过程、函数和程序包代替PL/SQL程序块由许多好处,例如,增 强可扩展性、提高模块化水平、可重用性增强、可维护性加强、有利 于抽象和数据隐藏、增强安全性等。l使用过程和函数可以允许开发人员增加新的功能,编写自己的例程, 可以让用户灵活地扩展数据库的核心能力。这些改变并不是要改变 Oracle的工作方式,而是可以让用户建立附加的过程和函数。用户既 可以自己使用这些过程和函数,也可以与其他用户共享这些能力。 l许多开发人员都非常重视开发模块化代码。用户通过编写小型的、可 管理的过程,以便在用户应用中定义单独的处理模块,可以将其组织 在一起形成复杂的应用。小型的、分离的过程远远比复杂的过程更容 易修改,且可以被更加有效地共享。l由于这些例程命名后保存在数据库中,所以任何应用都能够执行它们 (只要它们具有合适的权限)。 l使用过程、函数和程序包可以实现过程的抽象和数据的隐藏,例如, 假设用户正在调用其他用户编写的give_employee_raise()过程,用 户通过向其提供一些数据来进行工作。 6Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包教学过程13.1 概述 13.2 过程 13.3 函数 13.4 程序包 7Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包13.2 过程l从本质上来看,过程就是命名的PL/SQL程 序块,它可以被赋予参数并存储在数据库 中,然后由另外一个应用或PL/SQL例程调 用。l下面详细介绍过程的创建、执行、安全、 使用参数等内容。8Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包创建或替换 lcreate or replacelprocedure procedure_name(parameter, parameter)lauthid definer | current_schemais | aslpragma autonomous_transaction;llocal_declarationslbeginlexecutable statementslexceptionlexception handlerslend procedure_name;9Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包示例10Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包执行过程 l创建过程之后即可执行过程。用户既可以从匿名 PL/SQL程序块中直接调用,也可以在SQL*Plus 中使用execute()函数来执行。Execute()函数可 以简写为exec。l首先,使用匿名PL/SQL程序块执行过程。如图 13-4所示的示例使用了匿名PL/SQL程序块执行前 面创建的my_proc过程。l还可以使用exec函数执行过程。相对来说,使用 exec函数执行过程比使用匿名PL/SQL程序块调 用my_proc过程更快捷、方便。 11Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包使用参数 l过程可以进行参数化处理。参数可以是任意合法 的PL/SQL类型。参数可以有3种模式,即in、out 和in out各种参数的意义分别如下:。 in参数是输入参数,需要通过调用者传入,只能由过程 来读取。 out参数是输出参数,能够由过程写入。该参数适合用 于过程向调用者返回多个信息。 in out参数同时具有in参数和out参数的特性,过程可 以读取和写入它们的值。12Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包参数传递 l前面的示例使用了p_parm=100方式传递 参数。实际上,在Oracle系统中,可以使 用3种方式传递参数,即: 使用名称表示法 使用位置表示法 使用混合表示法13Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包局域声明 l如同匿名PL/SQL程序块一样,过程也可以定义局 域变量。这些定义紧随可选的参数列表之后。在 匿名PL/SQL程序块中,它使用declare关键字开 始。在过程声明中,由于使用了create or replace语法,所以不必再使用declare关键字。 在前面的swap过程示例中,l_temp就是一个局 域变量。l除了局域变量之外,在局域声明部分还可以定义 其他内容。用户可以定义记录、类型、数组,甚 至还可以是其它过程。14Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包教学过程13.1 概述 13.2 过程 13.3 函数 13.4 程序包 15Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包13.3 函数l函数与过程非常类似,也是数据库中存储 的命名PL/SQL程序块。创建函数与创建过 程要都遵循同样的规则。函数与过程的安 全方式和参数传递也相同。函数的主要特 征是它必须返回一个值。这个返回值既可 以是number或varchar2这样简单的数据类 型,也可以是PL/SQL数组或对象这样复杂 的数据类型。16Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包语法 lcreate or replacelfunction function_name (parameter, parameter) return datatypelauthid definer | current_schemalparallel_enableldeterministic is | aslpipelined using implementation_typelaggregate update value with external context using implementation_typelpragma autonomous_transaction;llocal declarationslbeginlexecutable statementslexceptionlexception handlerslend name;17Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包返回值 l定义过程和定义函数的主要区别之一是,定义函 数必须使用return子句返回数据。在定义函数的 函数体的任何地方,用户都可以return ;子句。需要注意的是,这里的 expression表达式要等于return数据类型。l如图13-25所示的是一个创建函数的示例。18Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包确定性 l如果对于给定的输入,函数总是能够返回 完全相同的结果,则称该函数具有确定性 。例如,upper()函数具有确定性,如果向 其输入Oracle Database 10g,那么它将返 回ORACLE DATABASE 10G。如果函数 不能每次都返回相同的值,用户就不能将 其作为确定性函数建立。l为了提示函数具有确定性,用户可以按照 如图13-28所示的示例那样执行。19Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包常见错误 l实际上,用户在开发函数时,经常会遇到 下面的错误:忘记获取返回值;试图定义 不能返回值的函数;定义没有返回数据类 型的函数等。l了解这些错误的形式将会帮助用户避免这 些问题,并且可以在出现错误时快速修正 它们。下面通过几个示例来介绍这些常见 的错误。20Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包教学过程13.1 概述 13.2 过程 13.3 函数 13.4 程序包 21Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包13.4 程序包lcreate or replace package package_namelauthid current_schema | definerlis | aslpragma serially_reusable;lcollection_type_definition lrecord_type_definitionlsubtype_definitionlcollection_declarationlconstant_declarationlexception_declarationlobject_declarationlrecord_declarationlvariable_declarationlcursor_speclfunction_speclprocedure_speclcall_speclpragma restrict_references(assertions)lend package_name;22Oracle Database 10g基础教程(第二版)第13章 过程、函数和程序包程序包主体 lcreate or replace package body package_namelis | aslpragma serially_reusable;lcollection_type_definition lrecord_type_definitionlsubtype_definitionlcollection_declarationlconstant_declarationlexception_declarationlobject_declarationlrecord_declarationlvariable_declarationlcursor_speclfunction_speclprocedure_speclcall_speclbeginlsequence_of_statementslend package_name;23Oracle Dat
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号