Oracle 数据库应用教程课件 第7章_第1页
Oracle 数据库应用教程课件 第7章_第2页
Oracle 数据库应用教程课件 第7章_第3页
Oracle 数据库应用教程课件 第7章_第4页
Oracle 数据库应用教程课件 第7章_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

1、第7章 过程、函数和程序包 7.1 子程序 7.2 程序包 7.3 小结 习题七 上机实验七 7.1子子程程序序以前我们们写的PL/SQL语句程序序都是瞬瞬时的,都没有有命名。其缺点点是:在在每次执执行的时时候都要要被编译译,并且且不能被被存储在在数据库库中,其其他PL/SQL块也无法法调用它它们。现现在我们们把命名名的PL/SQL块叫做子子程序,它们存存储在数数据库中中,可以以为它们们指定参参数,可可以在数数据库客客户端和和应用程程序中调调用。命命名的PL/SQL程序包括括存储过过程和函函数。程程序包是是存储过过程和函函数的集集合。子程序结结构与PL/SQL匿名块的的相同点点在于都都由声明明

2、、执行行、异常常三大部部分构成成,不同同之处在在于,PL/SQL匿名块的的声明可可选,而而子程序序的声明明则是必必需的。子程序的的优点如如下:(1)模块化:通过子子程序可可以将程程序分解解为可管管理的、明确的的逻辑模模块。(2)可重用性性:子程程序在创创建并执执行后,就可以以在任何何应用程程序中使使用。(3)可维护性性:子程程序可以以简化维维护操作作。(4)安全性:用户可可以设置置权限,保护子子程序中中的数据据,只能能让用户户提供的的过程和和函数访访问数据据。这不不仅可以以让数据据更加安安全,同同时可保保证正确确性。子程序有有两种类类型:过过程和函函数。其其中,过过程用于于执行某某项操作作;函

3、数数用于执执行某项项操作并并返回值值。7.1.1过程1过程的的创建和和执行过程可使使用createprocedure语句创建建,语法法如下:createorreplaceprocedure.parameterlistIs|aslocal_declarations;Beginexecutable statementsexceptionException_handlersEndprocedure_name;保留字Is前面的过过程定义义称为过过程头。过程头包包括过程程名和具具有数据据类型的的参数列列表。过过程体包包括声明明部分、执行部部分和异异常处理理部分。过程体体从保留留字Is之后开始始。其中中,

4、声明明部分和和异常处处理部分分是可选选的;执行部分分至少包包含一条条语句。这里的的Is|as就相当于于declare声明部分分,除了了拥有前前面的一一个过程程声明语语句外,其他和和以前的的匿名PL/SQL块一样。其中,replace表示在创创建存储储过程中中,如果果已经存存在同名名的存储储过程,则重新新创建;如果没没有此关关键词,则当数数据库中中有同名名的过程程时会报报错“ORA-00955号错误:名称已已被现有有对象占占用”。必须将将同名的的过程删删除后才才能创建建。1)创创建不带带参数的的过程。【例7.1】创建一个个过程multiplication,用来实现现九九乘乘法表。SQL crea

5、teorreplace proceduremultiplication2as3iinteger;4jinteger;5begin6dbms_output.put_line(printmultiplication);7for iin1.9loop8forj in 1.9loop9if i=jthen10dbms_output.put(to_char(j)|*|11to_char(i)|=|to_char(i*j)|);12end if;13endloop;14dbms_output.put_line();15endloop;16end;17/过程已创创建。出现编译译错误的的时候可可以用show

6、error或者desc user_errors来调试。2)执执行过程程创建过程程的时候候并不会会执行过过程,必必须在这这之后调调用过程程来执行行。执行行过程的的方法有有两种:一种是是在SQL提示符下下,使用用execute语句来执执行过程程;另一一种是在在匿名块块中调用用。execute执行过程程的语法法如下:execute procedure_name (parameters_list);【例7.2】执行multiplication过程。SQL setserverouton-将SQL*Plus的输出打打开SQL executemultiplication-执行过程程multiplicatio

7、n用execute命令。printmultiplication1*1=11*2=22*2=41*3=32*3=63*3=91*4=42*4=83*4=124*4=161*5=52*5=103*5=154*5=205*5=251*6=62*6=123*6=184*6=245*6=306*6=361*7=72*7=143*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81PL/SQL过程已成成功

8、完成成。【例7.3】在匿名块块中调用用过程multiplication。SQL begin2multiplication;3end;4/程序运行行结果同同上。2创建带带参数的的过程调用程序序通过参参数可向向被调用用子程序序传递值值。在上上述语法法parameterlist中,参数数的具体体形式如如下:参数1,方式1数据类类型1,参数2,方式2数据类类型2,参数方式式有以下下三种:(1)IN表示接受受值为默默认值。(2)OUT表示将值值返回给给子程序序的调用用程序。(3)IN OUT表示接受受值并返返回已更更新的值值。参数的书书写格式式为:(参数1 IN|OUT|INOUT参数类型型,参数2IN

9、|OUT|INOUT参数类型型,)。参数IN模式是默默认模式式。如果果未指定定参数的的模式,则认为为该参数数是IN参数。对对于OUT和INOUT参数,必必须明确确指定,并且这这两种类类型的参参数在返返回到调调用环境境之前必必须先赋赋值。IN参数可以以在调用用时赋默默认值,而OUT参数和INOUT参数不可可以。1)创创建带IN模式参数数的过程程【例7.4】创建一个个过程,以雇员员号为参参数查询询雇员的的姓名和和职位。SQL createorreplace procedurequeryEmpName(sFindNo emp.EmpNo%type)2as3sNameemp.ename%type;4s

10、Job emp.job%type;5begin6selectename,job intosName,sJobfromemp7whereempno=sFindNo;8dbms_output.put_line(IDis|sFindNo| de zhigongnameis|9sName|gongzuois|sJob);10exception11whenno_data_foundthen12dbms_output.put_line(nodata);13whentoo_many_rowsthen14dbms_output.put_line(toomanydata);15whenothers then16

11、dbms_output.put_line(error);17end;18/过程已创创建。【例7.5】执行queryEmpName过程。SQL execqueryEmpName(7900);IDis7900 dezhigongname is JAMESgongzuoisCLERK同样,也也可通过过匿名块块调用过过程queryEmpName。SQL Begin2queryEmpName(7900);3end;4/2)创创建带OUT模式参数数的过程程【例7.6】创建一个个过程,以雇员员号查询询雇员的的薪水。SQL createorreplace procedurequeryEmpSal(sFindN

12、o emp.EmpNo%type,v_saloutemp.sal%type)2as3begin4selectsalinto v_salfromemp5whereempno=sFindNo;6dbms_output.put_line(Thesalaryof|sFindNo|is :|v_sal);7exception8whenno_data_found then9dbms_output.put_line(nodata);10whentoo_many_rowsthen11dbms_output.put_line(toomanydata);12whenothers then13dbms_output

13、.put_line(error);14end;/过程已创创建。此过程带带有一个个输入参参数sFindNo和输出参参数v_sal,程序根据据输入参参数到表表中查询询记录,以返回回该员工工的薪水水值。【例7.7】执行queryEmpSal过程。可以声明明一个变变量,用用如下的的方式调调用该过过程。SQLvarsalarynumber;SQLexecqueryEmpSal(7900,:salary);Thesalary of 7900is: 950PL/SQL过程已成成功完成成。另外,也也可以从从一个匿匿名的PL/SQL程序中执执行上述述过程,以显示示sal_out变量的输输出结果果。以下下代码可可

14、以显示示queryEmpSal过程的返返回值。Declarevaluenumber;BeginqueryEmpSal(7934,value);DBMS_OUTPUT.PUT_LINE(VALUE的值为|to_char(value);End;/3)创创建带INOUT模式参数数的过程程【例7.8】创建两个个数进行行交换的的过程。SQL createorreplace procedureswap(p1 IN OUTnumber, p2 IN OUTnumber)2as3tempnumber;4begin5temp:=p1;6p1:=p2;7p2:=temp;8end;9/SQL /过程已创创建。【例

15、7.9】执行swap过程。SQL Declare2N1number:=10;3N2number:=20;4Begin5swap(N1,N2);6DBMS_OUTPUT.PUT_LINE(N1的值是|N1);7DBMS_OUTPUT.PUT_LINE(N2的值是|N2);8End;9/N1的值是20N2的值是10PL/SQL过程已成成功完成成。3过程的的授权只有创建建过程的的用户和和管理员员才有使使用过程程的权限限,如以以上示例例,创建建的过程程就像创创建的表表一样,属于当当前操作作的用户户,其他他用户如如果要调调用过程程,则需需要得到到该过程程的EXECUTE权限,然然后通过过点标记记(dot

16、notation)(即“用户户名.过程名”)来调用过过程(数据字典典是user_source)。以下演示示如何授授权:SQLGRANTEXECUTEONswap TO John;SQLGRANTEXECUTEONqueryEmpNameTOPUBLIC;前者将swap过程的执执行权限限授予John用户,后后者将queryEmpName的执行权权限授予予所有数数据库用用户。4删除过过程删除存储储过程的的命令的的一般格格式如下下:DROP PROCEDURE.;【例7.10】删除过程程multiplication。SQL DROPPROCEDURE multiplication过程已丢丢弃。7.1

17、.2函数函数与过过程相似似,也是是数据库库中存储储的已命命名PL/SQL程序块。与过程程不同的的是,函函数除了了完成一一定的功功能外,还必须须返回一一个值。1创建函函数创建函数数是指通通过RETURN子句指定定函数返返回值的的数据类类型。在在函数体体的任何何地方,用户都都可以通通过RETURNexpression语句从函函数返回回。定义函数数的语法法如下:CREATEOR REPLACE FUNCTION .parameters listRETURNIS|ASlocal_declarations;Beginexecutable statementsexceptionException_hand

18、lersEnd;其中,FUNCTION为PL/SQL函数的关关键字。【例7.11】创建一个个函数,以雇员员号查询询雇员的的姓名。SQL createorreplace functiongetName(snovarchar2)2returnvarchar3is4namevarchar(12);5begin6selectenameinto namefromemp7whereempno=sno;8return name;9exception10whentoo_many_rows then11dbms_output.put_line(toomanydata);12whenothersthen13dbm

19、s_output.put_line(error);14end;15/函数已创创建。2执行函函数及授授权1)在在匿名块块中调用用函数调用用与过程程调用很很相似,在匿名名过程中中通过函函数名(或参数)可以调用用一个函函数。因因为过程程没有显显式的RETURN语句,所所以过程程调用可可以是一一条单独独的语句句,写在在单独的的行中。而函数数则必须须有一个个返回值值,所以以函数调调用要借借助于可可执行语语句来完完成,例例如赋值值语句、选择语语句和输输出语句句。下面面的例子子通过匿匿名过程程调用getname函数,将将雇员号号作为参参数,此此函数将将雇员姓姓名传给给调用块块,然后后显示雇雇员姓名名。【例7

20、.12】通过匿名名过程调调用getname函数。SQL declare2namevarchar(12);3begin4name:=getname(7902);5dbms_output.put_line(name);6end;7/FORDPL/SQL过程已成成功完成成。2)在在SQL语句中调调用除了在匿匿名块中中调用外外,也可可以在SQL语句中调调用函数数。【例7.13】在SQL语句中调调用getname,显示雇员员号为“7369”的雇员员姓名。SQL selectgetname(7369)from dual;GETNAME(7369)-SMITH【例7.14】从雇员表表中查找找雇员号号为“73

21、69”的雇员员信息。SQL Select* fromempwhereename=getname(7369);EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO-7369SMITHCLERK790217-12月-80800203函数的的授权与过程一一样,只只有创建建函数的的用户和和管理员员才有权权使用函函数,其其他用户户如果要要调用函函数,则则需要得得到该函函数的EXECUTE权限。【例7.15】将getname函数的执执行权限限授予John用户。SQLGRANTEXECUTEONgetnameTO John;4删除函函数删除函数数的命令令的一般般格式如如下:DROP F

22、UNCTION .;【例7.16】删除函数数getname。SQL DROPFUNCTIONgetname;7.1.3过程和函函数的比比较表7-1过程和函函数的比比较7.2程序包7.2.1程序包概概述程序包是是数据库库中的一一个实体体,包含含一系列列公共常常量、变变量、数数据类型型、游标标、过程程及函数数的定义义。使用用包更加加体现了了模块化化编程的的优点,使得开开发工作作能灵活活自如地地进行。程序包包包括两两个部分分:程序序包规范范说明部部分和程程序包主主体部分分。1程序包包规范说说明部分分该部分相相当于一一个包的的头,类类似于接接口,可可以对包包的部件件作简单单说明。其中的的过程、函数、变

23、量、常量和和游标都都是公共共的,可可在应用用程序中中访问。(1)使用createpackage进行创建建。(2)包含公用用对象和和类型。(3)声明类型型、变量量、常量量、异常常、游标标和子程程序。(4)可以在没没有程序序包主体体部分的的情况下下存在。2程序包包主体部部分(1)使用createpackagebody进行创建建。(2)包含子程程序和游游标的定定义。(3)包含私有有声明。(4)不能在没没有程序序包规格格说明的的情况下下存在。7.2.2创建程序序包程序包包包括两部部分:规规范和主主体。规规范是程程序包的的公共接接口;主主体是规规范的实实现,以以及私有有例程、数据和和变量。1创建程程序包

24、规规范CREATEORREPLACEPACKAGE package_nameIS| AS公用类型型或变量量常量的的声明;公用过程程或函数数的声明明;ENDpackage_name;/2创建程程序包主主体CREATEORREPLACEPACKAGE BODYpackage_nameIS| AS私有类型型或变量量常量的的声明;公用过程程或函数数的实现现;ENDpackage_name规范是程程序包的的接口,规范中中定义的的所有内内容都可可以由调调用者使使用(当然需要要具有EXECUTE特权),比如规规范中定定义的过过程函数数可以被被执行,类型可可以被访访问,变变量可以以被引用用。【例7.17】使用

25、两个个过程print_ename()和print_sal(),定义名为为employee_pkg的程序包包。SQL CREATEORREPLACE2PACKAGE employee_pkgas3Procedureprint_ename(p_empnonumber);4Procedureprint_sal(p_empnonumber);5End;6/程序包已已创建。此时并没没有为过过程提供供代码,只是定定义了名名称和参参数。这个时候候如果试试图使用用这个包包,则会会报错。SQL execemployee_pkg.print_ename(1234);ERROR位于第1行:ORA-04068:已丢弃

26、程程序包的的当前状状态ORA-04067:未执行,package bodySCOTT.EMPLOYEE_PKG不存在ORA-06508: PL/SQL:无法在调调用之前前找到程程序单元元ORA-06512:在line 1程序包是是过程函函数的具具体实现现部分,实现规规范中定定义的接接口。SQL CREATEORREPLACE2PACKAGE BODYemployee_pkgas3Procedureprint_ename(p_empnonumber) is4L_enameemp.ename%type;5Begin6Selectenameinto l_enamefromempwhereempno=

27、p_empno;7Dbms_output.put_line(l_ename);8Exception9Whenno_data_found then10Dbms_output.put_line(Invalid employee number);11Endprint_ename;12Procedureprint_sal(p_empnonumber) is13L_salemp.sal%type;14Begin15Selectsalinto l_salfromempwhereempno=p_empno;16Dbms_output.put_line(l_sal);17Exception18WhenNO_D

28、ATA_FOUNDthen19Dbms_output.put_line(Invalid employee number);20End print_sal;21End employee_pkg;22/程序包主主体已创创建。7.2.3执行程序序包执行程序序包中的的过程可可以使用用如下语语句:EXECUTE包名.过程名【例7.18】执行employee_pkg包里的print_ename过程。SQLsetserveroutputonSQL execemployee_pkg.print_ename(7782);运行结果果如下:CLARKPL/SQL过程已成成功完成成。SQLexecemployee_p

29、kg.print_sal(7782);运行结果果如下:2450PL/SQL过程已成成功完成成。执行程序序包中的的函数可可以通过过一段代代码块来来实现。7.2.4程序包中中的游标标程序包中中可以定定义和使使用游标标。游标标的定义义分为游游标规范范和游标标主体两两部分。在游标标规范说说明部分分必须通通过RETURN语句指定定游标的的返回类类型。RETURN语句指定定游标获获取和返返回的数数据元素素由select语句确定定。select语句只出出现在主主体定义义中,而而不出现现在规范范说明中中。【例7.19】下面使用用程序包包中的游游标。student_package程序包中中包含4个过程和和1个函

30、数。其中,select_student过程中使使用了游游标。详详细过程程如下:(1)首先创建建student表结构。SQLcreate table student(stuidvarchar2(4),stunamevarchar2(10),sechar(1);表已创建建。(2)定义声明明。SQL createorreplace packagestudent_package is2typestudent_curisrefcursor returnstudent%rowtype;3procedure insert_student(stuinstudent%rowtype);4procedure up

31、date_student(stustudent%rowtype);5procedure delete_student(snostudent.stuid%type);6procedure select_student(stucurinoutstudent_cur);7functiongetStudentCountreturnnumber;8endstudent_package;9/程序包已已创建。(3)定义主体体。SQL createorreplace packagebodystudent_packageis2procedure insert_student(stustudent%rowtype

32、) is3icountint;4begin5selectcount(*)intoicountfrom studentwherestuid=stu.stuid;6ificount0then7dbms_output.put_line(insertdataisalreadyexsist);8else9insertintostudent values(stu.stuid,stu.stuname,stu.se);10commit;11endif;12exception13when too_many_rowsthen14dbms_output.put_line(insertdataisalreadyexs

33、ist);15endinsert_student;16procedureupdate_student(stustudent%rowtype) is17icountint;18begin19selectcount(*)intoicountfrom studentwherestuid=stu.stuid;20ificount0then21update studentset stuname=stu.stuname,se=stu.se where stuid=stu.stuid;22commit;23else24dbms_output.put_line(updatedatanotexist!);25e

34、ndif;26endupdate_student;27proceduredelete_student(snostudent.stuid%type)is28icountint;29begin30ificount0then31delete fromstudentwherestuid=sno;32commit;33else34dbms_output.put_line(deletedatanotexist);35endif;36enddelete_student;37procedureselect_student(stucurinoutstudent_cur) is38begin39openstucu

35、rforselect *fromstudent;40endselect_student;41functiongetStudentCountreturnnumber is42icountint;43begin44selectcount(*)intoicountfrom student;45returnicount;46endgetStudentCount;47end student_package;48/程序包主主体已创创建。(4)调用程序序包插入入一行数数据。SQL declare2stustudent%rowtype;3begin4stu.stuid:=1009;5stu.stuname:=

36、tonglei;6stu.se:=f;7student_package.insert_student(stu);8end;9/PL/SQL过程已成成功完成成。(5)调用程序序包中的的过程select_student显示数据据。SQLvarssrefcursor-定义游标标变量SQL execstudent_package.select_student(:ss);PL/SQL过程已成成功完成成。显示游标标变量内内容如下下:SQL printssSTUISTUNAMES-1009tongleif7.2.5程序包的的优点程序包的的优点如如下:(1)模块化。包可以以使逻辑辑上相关关联的类类型、项项目和

37、子子程序等等封装进进一个命命名PL/SQL块中。每每个包划划分功能能清晰,包的接接口简单单、明了了。(2)可重用性性。一旦旦命名并并保存在在数据库库中,任任何应用用都可以以使用。(3)简单的应应用程序序设计。当设计计应用程程序时,只需知知道包的的接口部部分的信信息,可可以只创创建并编编译包的的规范而而不创建建包体。同样可可以在程程序中引引用包,等整个个应用程程序完成成后再来来定义具具体的包包体。(4)抽象和数数据隐藏藏。可以以指定公公有信息息和私有有信息。只有公公有信息息才可以以被外部部应用程程序访问问。(5)更好的执执行效能能。包里里的子程程序第一一次被调调用时,整个包包被调到到内存中中,以

38、后后的调用用就可以以直接从从内存中中读取。这样可可以减少少不必要要的重新新编译。7.2.6有关子程程序和程程序包的的信息子程序和和程序包包是数据据库中存存储的对对象,Oracle会在数据据字典中中存储所所有对象象的信息息。通过过查询数数据字典典可以获获得它们们的信息息。通过过查询USER_OBJECTS数据字典典视图可可以获取取有关在在会话中中创建的的字程序序和程序序包的信信息。【例7.20】获取程序序包中子子程序和和程序包包的信息息。SQLCOLUMN OBJECT_NAME FORMATA18SQL SELECTOBJECT_NAME,OBJECT_TYPEFROM USER_OBJECT

39、SWHEREOBJECT_TYPEIN(PROCEDURE,FUNCTION,PACKAGE,PACKAGEBODY);OBJECT_NAMEOBJECT_TYPE-EMPLOYEE_PKGPACKAGEEMPLOYEE_PKGPACKAGEBODYQUERYEMPNAMEPROCEDUREQUERYEMPSALPROCEDURESWAPPROCEDURE【例7.21】要获取存存储子程程序的文文本,可可以查询询USER_SOURCE。SQLCOLUMN LINEFORMAT 9999SQLCOLUMN TEXTFOR A50SQLSELECT LINE,TEXTFROM USER_SOURCE

40、 WHERE NAME=SWAP;LINE TEXT-1 procedureswap(p1 IN OUTnumber,p2INOUT number)2 as3tempnumber;4begin5temp:=p1;6p1:=p2;7p2:=temp;8 end;【例7.22】获得程序序包中子子程序规规范employee_pkg信息。SQL DESCemployee_pkg;PROCEDUREPRINT_ENAME7.3小结过程、函函数和子子程序都都可以用用于执行行对数据据库的操操作,可可以带上上用户自自定义的的参数。它们封封装了数数据类型型定义、变量说说明、游游标、异异常等,方便了了用户管管理操

41、纵纵数据库库数据。习题七一、选择择题1执行特特定任务务的子程程序是()。A.函数B.过程C.程序包D.游标2子程序序的()模式参数数可以在在调用子子程序时时指定一一个常量量。A.INB.OUTC.INOUT3.如果存储储过程的的参数类类型为OUT,那么调用用时传递递的参数数应该为为()。A.常量B.表达式C.变量D.都可以4下列有有关存储储过程的的特点,说法错错误的是是()。A.存储过程程不能将将值传回回调用的的主程序序B.存储过程程是一个个命名的的模块C.编译的存存储过程程存放在在数据库库中D.一个存储储过程可可以调用用另一个个存储过过程5包中不不能包含含的元素素为()。A.存储过程程B.存

42、储函数数C.游标D.表6下列有有关包的的使用,说法错错误的是是()。A.在不同的的包内模模块可以以重名B.包的私有有过程不不能被外外部程序序调用C.包体中的的过程和和函数必必须在包包头部分分说明D.必须先创创建包头头,然后后创建包包体二、编程程题1编写程程序包,此程序序包有两两个过程程和一个个函数,第一个个过程根根据职员员编号打打印职员员姓名,第二个个过程根根据职员员编号打打印职员员的部门门编号。函数根根据职员员编号返返回职员员的薪水水。提示:使使用scott用户的emp表作为数数据源。2编写函函数接受受学生的的学号,并计算算该学生生3门课程的的总分。3编写一一个过程程,将10号部门员员工薪水

43、水上涨10%,20号部门员员工薪水水上涨20%,其他部部门员工工薪水保保持不变变。上机实验验七实验1过程目的和要要求:1掌握编编写过程程的方法法。2掌握调调用过程程的方法法。实验内容容:编写一个个过程,要求根根据用户户输入的的员工号号(emp_no)查询EMP表,返回回员工的的姓名和和工作职职位(empName和empJob)。并编写一一个匿名名块调用用此过程程(使用SCOTT用户的EMP表)。SQL createorreplace procedurepro_emp(emp_nonumber)2as3empNamevarchar2(20);4empJobvarchar2(20);5begin6

44、selectename,job intoempName,empJobfromempwhereempno=emp_no;7DBMS_OUTPUT.PUT_LINE(雇员的姓姓名是:|empName);8DBMS_OUTPUT.PUT_LINE(雇员的职职位是:|empJob);9EXCEPTION10when NO_DATA_FOUNDthen11DBMS_OUTPUT.PUT_LINE(雇员编号号未找到到!);12endpro_emp;13/过程已创创建。SQL setserveroutputon;SQL executepro_emp(7369);雇员的姓姓名是:SMITH雇员的职职位是:CL

45、ERKPL/SQL过程已成成功完成成。实验2函数目的和要要求:1掌握编编写函数数的方法法。2掌握调调用函数数的方法法。实验内容容:1编写函函数以接接受学生生的学号号,并计计算此学学生3门课程的的平均分分。SQL createorreplace function fun_score(student_no number)2returnfloat3as4s1 float(10);5s2 float(10);6s3 float(10);7score_avgfloat(10);8begin9selectoracle,java,csharpintos1,s2,s3from score where stuID=student_no;10score_avg:=(s1+s2+s3)/3.0;11returnscore_avg;12EXCEPTION13when NO_DATA_FOUNDthen14DBMS_OUTPUT.PUT_LINE(学号未找

温馨提示

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

评论

0/150

提交评论