Version3.0子程序和程序包第八章2回顾•在上一章中,我们讨论了–异常–游标管理3目标•本章将讨论–子程序–程序包–有关子程序和程序包的信息4子程序16-1•命名的PL/SQL块•子程序的各个部分–声明部分–可执行部分–异常部分(可选)5子程序16-2•子程序的优点–模块化•将程序分解为多个逻辑模块–可重用性•子程序在被执行之后,可以在任意数目的应用程序中使用–可维护性•子程序简化了维护6子程序16-3•子程序的类型–过程•用于执行某项操作–函数•用于执行某项操作并返回值7子程序16-4•过程–是使用CREATEPROCEDURE语句创建的–语法CREATEorREPLACEPROCEDUREProc_name[parameterlist]IS|ASlocaldeclarations;BEGIN(executablestatements)END其中,Proc_name是过程的名称,parameterlist是参数列表,localdeclarations是局部声明,executablestatements是可执行语句。8子程序16-5•参数模式–IN•接受值•默认模式–OUT•将值返回给子程序的调用程序–INOUT•接受值并返回已更新的值9子程序16-6•执行过程–使用EXECUTE语句–语法•EXECUTEProcedure_name(listofparameters)其中,Procedure_name是过程的名称,listofparameters是参数列表。–示例•EXECUTEitems('i201')10子程序16-7•删除过程–使用DROPPROCEDURE语句进行删除–语法•DROPPROCEDUREprocedure_name;其中,procedure_name是过程的名称。–示例•Dropprocedureor_detail;11子程序16-8•函数–使用CREATEFUNCTION语句进行创建–语法CREATEorREPLACEFUNCTIONfunction_name[argumentlist]RETURNdatatypeIS|AS(localdeclaration)BEGIN(executablestatements)END其中,function_name是函数名称,argumentlist是参数列表,datatype是数据类型,localdeclaration是局部声明,executablestatements是可执行语句。12子程序16-9•访问函数–用两种方式进行访问•使用PL/SQL块•使用SQL语句–仅接受IN参数13子程序16-10•通过PL/SQL块进行访问–语法DECLARE(localdeclaration)BEGINVariable:=function_name(parameterlist)DBMS_OUTPUT.PUT_LINE(variable)END其中,localdeclaration是局部声明,Variable是变量,function_name是函数名称,parameterlist是参数列表。14子程序16-11•通过SQL语句进行访问–语法•SELECTfunction_name(parameter)FROMDUAL;其中,function_name是函数名称,parameter是参数。–示例•Selectsqr(16)fromdual;15子程序16-12•函数的纯度级别–定义由函数读取或修改的数据种类•各种纯度级别–WNDS-不写入数据库状态–RNDS-不读取数据库状态–WNPS-不写入程序包状态–RNPS-不读取程序包状态16子程序16-13•限制–必须将函数存储在数据库中–函数只能接受IN参数,而不能接受INOUT或OUT参数–它不得对于另一个块是局部的–形参不能是PL/SQL类型17子程序16-14过程函数作为PL/SQL语句执行作为表达式的一部分调用在规格说明中不包含RETURN子句必须在规格说明中包含RETURN子句可以返回任何值必须返回单个值可以包含RETURN语句,但是与函数不同,它不能用于返回值必须包含至少一条RETURN语句过程与函数18子程序16-15•自主事务处理–主事务处理启动自主事务处理–然后主事务处理被暂停–自主事务处理SQL操作–然后终止自主事务处理–恢复主事务处理•pragmaAUTONOMOUS_TRANSACTION用于标记子程序19子程序16-16•自主事务处理的特征–与主事务处理的状态无关–不影响主事务处理的结果–能够启动其他自主事务处理20程序包7-1•相关对象的封装•程序包的各部分–程序包规格说明声明子程序–程序包主体定义子程序21程序包7-2•程序包规格说明–使用CREATEPACKAGE命令进行创建–包含公用对象和类型–声明类型、常量、变量、异常、游标和子程序–可以在没有程序包主体的情况下存在22程序包7-3•程序包主体–使用CREATEPACKAGEBODY命令进行创建–包含子程序和游标的定义–包含私有声明–不能在没有程序包规格说明的情况下存在23程序包7-4•程序包的执行–可使用下列表示法:Package-name.type-namePackage-name.object-namePackage-name.subprogram-name其中,Package-name是程序包名称,type-name是类型名称,object-name是对象名称,subprogram-name是子程序名称。–示例DBMS_OUTPUT.PUT_LINE(Hello);24程序包7-5•重载–程序包中的多个子程序可以具有相同的名称–它们的形参是不同的–只能位于打包的子程序中–限制如果子程序的参数仅名称或模式不同,则不能重载不能基于其返回类型重载子程序25程序包7-6•程序包的优点–模块化–更轻松的应用程序设计–信息隐藏–新增功能–性能更佳26程序包7-7公用项私有项可以在程序包之外引用不能在程序包之外引用是在程序包规格说明中定义的是在程序包主体中定义的用于全局目的用于局部目的公用项与私有项27有关子程序和程序包的信息•User_objects–用于检查对象是否存在•User_source–用于获取对象的代码28总结2-1•子程序是命名的PL/SQL块•PL/SQL支持两种类型的子程序,即过程和函数•过程用于执行某项操作•函数用于计算并返回值•程序包是一种数据库对象,它是相关对象的封装29总结2-2•程序包由两部分组成,即规格说明和主体•允许重载打包的子程序•使用程序包的优点是:模块化、更轻松的应用程序设计、信息隐藏、新增功能以及性能更佳