oracle基础教程7_第1页
oracle基础教程7_第2页
oracle基础教程7_第3页
oracle基础教程7_第4页
oracle基础教程7_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,专题七过程、函数和程序包,2,回顾,游标就是指向上下文区的句柄或指针。游标有两种类型:显式游标、隐式游标。四个游标属性:SQLFOUND、SQLNOTFOUND、SQLROWCOUNT、SQLISOPEN显式游标的使用步骤:个记录变量和%ROWTYPE带参数的游标游标FOR循环(循环游标)游标中的更新和删除REF游标,3,教学目标,掌握过程的用法掌握函数的用法理解过程与函数的相同点和不同点理解程序包的概念并能熟练应用,4,工作任务,用无参过程实现“HelloWorld!”程序用带输入参数的过程向表中插入记录用带输出参数的过程查询表中的记录数使用带输入输出参数的过程查询记录是否存在使用函数查询部门信息使用程序包封装过程和函数,5,相关实践知识,从开始菜单中打开SQL*Plus工具,以SCOTT用户的身份登录到数据库,6,不带参数的过程2-1,输入以下代码,创建一个最简单的过程功能:显示”HelloWorld!”,7,不带参数的过程2-2,执行过程EXECUTEsp_helloWorld;执行结果:删除过程DROPPROCEDUREsp_helloWorld;,8,带输入参数的过程3-1,实现的功能:向表dept中插入一条记录创建带输入参数的过程,代码为:,9,带输入参数的过程3-2,CREATEORREPLACEPROCEDUREsp_dept_insert(i_deptnoNUMBER,i_dnameVARCHAR2,i_locVARCHAR2)ASBEGININSERTINTOdeptVALUES(i_deptno,i_dname,i_loc);COMMIT;EXCEPTIONWHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(添加失败!原因为:|SQLERRM);ROLLBACK;ENDsp_dept_insert;,10,带输入参数的过程3-3,分别输入两组数据来执行过程,结果如下:,11,带输出参数的过程3-1,实现功能:通过输出参数count来得到dept表中的记录数创建带输出参数的过程,CREATEORREPLACEPROCEDUREsp_getcount(o_countOUTNUMBER)ASBEGINSELECTCOUNT(*)INTOo_countFROMdept;ENDsp_getcount;,12,带输出参数的过程3-2,编写一段匿名的PL/SQL块来执行过程,DECLAREcntNUMBER;BEGINsp_getcount(cnt);DBMS_OUTPUT.PUT_LINE(dept表中的记录数为:|cnt);END;,13,带输出参数的过程3-3,输出结果:,14,带INOUT参数的过程2-1,实现功能:查询某个部门名称在表dept中是否已经存在创建带INOUT参数的过程,代码为:,CREATEORREPLACEPROCEDUREsp_dept_dname_exist(io_valueINOUTVARCHAR2)ISl_countNUMBER;BEGINSELECTCOUNT(*)INTOl_countFROMdeptWHEREdname=io_value;IF(l_count0)THENio_value:=存在;ELSEio_value:=不存在;ENDIF;ENDsp_dept_dname_exist;,15,带INOUT参数的过程2-2,执行过程:输出结果:部门名称ACCOUNTING存在!,DECLAREl_iotestvarchar2(20):=ACCOUNTING;BEGINsp_dept_dname_exist(l_iotest);DBMS_OUTPUT.PUT_LINE(部门名称ACCOUNTING|l_iotest|!);END;,16,函数4-1,实现功能:按部门编号查询出表dept中的部门名称创建一个函数,代码为:,17,函数4-2,CREATEORREPLACEFUNCTIONf_dept_getname_byno(i_deptnoNUMBER)RETURNVARCHAR2ASl_dnameVARCHAR2(14);BEGINSELECTdnameINTOl_dnameFROMdeptWHEREdeptno=i_deptno;RETURNl_dname;EXCEPTIONWHENNO_DATA_FOUNDTHENRETURN错误!该编号的部门不存在!;ENDf_dept_getname_byno;,18,函数4-3,函数的调用及其输出结果:,19,函数4-4,删除函数DROPFUNCTIONf_dept_getname_byno;,20,过程与函数小结2-1,共同点:两者的实质都是已命名的PL/SQL程序块,即子程序,它们是子程序的两种类型,存储在数据库中,可以从任何数据库客户端和前台应用程序中调用它们。,21,过程与函数小结2-2,不同点:,22,程序包5-1,利用程序包封装过程sp_dept_insert和函数f_dept_getname_byno程序包规范部分的代码:,CREATEORREPLACEPACKAGEpkg_deptASPROCEDUREsp_dept_insert(i_deptnoNUMBER,i_dnameVARCHAR2,i_locVARCHAR2);FUNCTIONf_dept_getname_byno(i_deptnoNUMBER)RETURNVARCHAR2;ENDpkg_dept;,23,程序包5-2,程序包主体部分的代码,CREATEORREPLACEPACKAGEBODYpkg_deptAS-过程sp_dept_insertPROCEDUREsp_dept_insert(i_deptnoNUMBER,i_dnameVARCHAR2,i_locVARCHAR2)ASBEGININSERTINTOdeptVALUES(i_deptno,i_dname,i_loc);COMMIT;EXCEPTIONWHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(添加失败!原因为:|SQLERRM);ROLLBACK;ENDsp_dept_insert;,24,程序包5-3,-函数f_num_rangeFUNCTIONf_dept_getname_byno(i_deptnoNUMBER)RETURNVARCHAR2ASl_dnameVARCHAR2(14);BEGINSELECTdnameINTOl_dnameFROMdeptWHEREdeptno=i_deptno;RETURNl_dname;EXCEPTIONWHENNO_DATA_FOUNDTHENRETURN错误!该编号的部门不存在!;ENDf_dept_getname_byno;ENDpkg_dept;,25,程序包5-4,执行程序包中的过程和函数:,26,程序包5-5,删除程序包:只删除程序包主体:DROPPACKAGEBODYpkg_dept;删除整个程序包(规范+主体):DROPPACKAGEpkg_dept;,27,小结:程序包的优点,使用程序包的优点:信息隐藏模块化对多态的支持性能更佳,28,过程返回结果集2-1,在Oracle中的过程不能象SQLSERVER那样直接返回结果集,而必须借助于REF游标程序包规范中的代码:,CREATEORREPLACEPACKAGEpkg_deptASTYPEdeptcursorISREFCURSOR;PROCEDUREsp_dept_getall(dept_curOUTdeptcursor);ENDpkg_dept;,29,过程返回结果集2-2,程序包主体中的代码:执行过程:,CREATEORREPLACEPACKAGEBODYpkg_deptASPROCEDUREsp_dept_getall(dept_curOUTdeptcursor)ISBEGINOPENdept_curFORSELECT*FROMdept;ENDsp_dept_getall;ENDpkg_dept;,VARIABLEtest_curREFCURSOR;EXECUTEpkg_dept.sp_dept_getall(:test_cur);PRINTtest_cur;,30,查看,查看过程、函数的信息SELECTobject_name,procedure_nameFROMUSER_PROCEDURES;查看过程、函数的源代码SELECTline,textFROMUSER_SOURCEWHEREname=;,31,OEM中管理过程、函数、程序包,请老师用浏览器打开OEM,演示在OEM中管理过程、函数、程序包,32,总结,过程和函数都是命名的PL/SQL程序块,合称子程序过程有三种参数模式:IN、OUT和INOUT过程用户执行特定的任务,函数用于执行任务并返回值过程与函数的相同点和不同点程序包是对过程、函数、变量、常量、游标、异常及PL/SQL数据类型等的封装程序包由两部分组成,即包规范和包主体使用程序包的优点,33,过程的定义,定义:过程是一组为了完成特定功能的、符合数据库程序脚本规范的程序,经编译后存储在数据库中,然后由一个应用程序或其他的PL/SQL程序调用。从根本上讲,过程就是命名的PL/SQL程序块。,34,创建过程的语法,CREATEORREPLACEPROCEDUREprocedure_name(parameter_list)AS|ISlocal_declarationsBEGINexecutable_statementsEXCEPTIONexception_handlersENDprocedure_name;,35,执行过程,在SQL提示符下:EXECUTEprocedure_name(parameters_list)在其它的过程、函数或匿名的PL/SQL块中的可执行语句部分执行过程,直接写过程的名称(如有参数需带上)即可,36,删除过程,删除过程的语法:DROPPROCEDUREprocedure_name;,37,过程的参数模式,Oracle中过程的参数模式有三种:IN、OUT和INOUT,即输入、输出和输入输出定义参数的语法:parameter_nameIN|OUT|INOUTDATATYPE:=|DEFAULTexpression,38,IN模式参数,IN模式是输入模式,可以传递输入参数IN模式是默认模式,如果未指定参数的模式,则该参数是IN模式的可以在参数列表中为IN参数赋予一个默认值,39,OUT模式参数,OUT模式是输出模式,可以传递输出参数OUT模式的参数,则必须明确指定,即OUT必须注明在返回到调用环境之前,应该先给OUT模式的参数赋值不能为OUT模式的参数赋默认值,40,INOUT模式参数,INOUT模式是一种比较特殊的模式,它兼有IN模式和OUT模式的特点INOUT模式的参数,则必须明确指定不能为INOUT模式的参数赋默认值,41,函数的定义,定义函数的实质也是数据库中已命名的PL/SQL程序块。它的主要特性是函数能且只能返回一个值。,42,创建函数的语法,CREATEORREPLACEFUNCTIONfunction_name(parameter_list)RETURNDATATYPEAS|ISlocal_declarationsBEGINexecutable_statementsEXCEPTIONexception_handlersENDfunction_name;,43,函数定义的要点,创建函数时通过RETURN子句来定义函数的返回类型在函数体的任何地方用户都可以通过RETURNexpression语句从函数返回,但表达式的类型一定要与RETURN子句中定义的数据类型一致。函数的参数模式只能是IN模式的,而不能是OUT或INOUT模式的。,44,调用函数,在SQL提示符下:SELECTfunction_namefromdual;在其它的过程、函数或匿名的PL/SQL块中的可以用一个与函数的返回类型相同的变量来接收该函数不能用EXECUTE语句来调用函数,45,删除函数,删除函数的语法:DROPFUNCTIONfunction_name;,46,程序包,程序包是对过程、函数、变量、常量、游标、异常及PL/SQL数据类型等的封装,是一种数据库对象。它由两部分构成:程序包规范程序包主体,47,创建程序包规范的语法,创建程序包规范的语法CREATEORREPLACEPACKAGEpackage_nameIS|ASpublictypeanditemdeclarationssubprogramspecificationsENDpackage_name;,48,创建程序包主体的语法,创建程序包主体的语法CREATEORREPLACEPACKAGEBODYpackage_nameIS|ASinitial

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论