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

下载本文档

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

文档简介

第7章

过程、函数和程序包

7.1子程序

7.2程序包

7.3小结

习题七

上机实验七

7.1子程序

以前我们写的PL/SQL语句程序都是瞬时的,都没有命名。其缺点是:在每次执行的时候都要被编译,并且不能被存储在数据库中,其他PL/SQL块也无法调用它们。现在我们把命名的PL/SQL块叫做子程序,它们存储在数据库中,可以为它们指定参数,可以在数据库客户端和应用程序中调用。命名的PL/SQL程序包括存储过程和函数。程序包是存储过程和函数的集合。

子程序结构与PL/SQL匿名块的相同点在于都由声明、执行、异常三大部分构成,不同之处在于,PL/SQL匿名块的声明可选,而子程序的声明则是必需的。子程序的优点如下:

(1)模块化:通过子程序可以将程序分解为可管理的、明确的逻辑模块。

(2)可重用性:子程序在创建并执行后,就可以在任何应用程序中使用。

(3)可维护性:子程序可以简化维护操作。

(4)安全性:用户可以设置权限,保护子程序中的数据,只能让用户提供的过程和函数访问数据。这不仅可以让数据更加安全,同时可保证正确性。

子程序有两种类型:过程和函数。其中,过程用于执行某项操作;函数用于执行某项操作并返回值。

7.1.1过程

1.过程的创建和执行

过程可使用createprocedure语句创建,语法如下:

createorreplaceprocedure[<方案名>.]<存储过程名>

[parameterlist]

{Is|as}

[local_declarations];

Begin

executablestatements

[exception]

[Exception_handlers]

End[procedure_name];

保留字Is前面的过程定义称为过程头。

过程头包括过程名和具有数据类型的参数列表。过程体包括声明部分、执行部分和异常处理部分。过程体从保留字Is之后开始。其中,声明部分和异常处理部分是可选的;

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

1)创建不带参数的过程。

【例7.1】

创建一个过程multiplication,用来实现九九乘法表。

SQL>createorreplaceproceduremultiplication

2as

3iinteger;

4jinteger;

5begin

6dbms_output.put_line('printmultiplication');

7foriin1..9loop

8forjin1..9loop

9ifi>=jthen

10dbms_output.put(to_char(j)||'*'||

11to_char(i)||'='||to_char(i*j)||'');

12endif;

13endloop;

14dbms_output.put_line('');

15endloop;

16end;

17/

过程已创建。

出现编译错误的时候可以用showerror或者descuser_errors来调试。

2)执行过程

创建过程的时候并不会执行过程,必须在这之后调用过程来执行。执行过程的方法有两种:一种是在SQL提示符下,使用execute语句来执行过程;另一种是在匿名块中调用。

execute执行过程的语法如下:

executeprocedure_name(parameters_list);【例7.2】

执行multiplication过程。

SQL>setserverouton--将SQL*Plus的输出打开

SQL>executemultiplication--执行过程multiplication用execute命令。

printmultiplication

1*1=1

1*2=22*2=4

1*3=32*3=63*3=9

1*4=42*4=83*4=124*4=16

1*5=52*5=103*5=154*5=205*5=25

1*6=62*6=123*6=184*6=245*6=306*6=36

1*7=72*7=143*7=214*7=285*7=356*7=427*7=49

1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64

1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81

PL/SQL过程已成功完成。

【例7.3】

在匿名块中调用过程multiplication。

SQL>begin

2multiplication;

3end;

4/

程序运行结果同上。

2.创建带参参数的过程程调用程序通通过参数可可向被调用用子程序传传递值。在在上述语法法[parameterlist]中,参数的的具体形式式如下:<参数1,[方式1]<数据类型型1>,<参数2,[方式2]<数据类型型2>,…参数方式有有以下三种种:(1)IN表示接受值值为默认值值。(2)OUT表示将值返返回给子程程序的调用用程序。(3)INOUT表示接受值值并返回已已更新的值值。参数的书写写格式为::[(参数1IN| OUT| INOUT参数类型,参数2

IN| OUT| INOUT参数类型,……)]。参数IN模式是默认模模式。如果未未指定参数的的模式,则认认为该参数是是IN参数。对于OUT和INOUT参数,必须明明确指定,并并且这两种类类型的参数在在返回到调用用环境之前必必须先赋值。。IN参数可以在调调用时赋默认认值,而OUT参数和INOUT参数不可以。。1)创建带带IN模式参参数的过程【例7.4】创建一个过程程,以雇员号号为参数查询询雇员的姓名名和职位。SQL>createorreplaceprocedurequeryEmpName(sFindNoemp.EmpNo%type)2as3sNameemp.ename%type;4sJobemp.job%type;5begin6selectename,jobintosName,sJobfromemp7whereempno=sFindNo;8dbms_output.put_line('IDis'||sFindNo||'dezhigongnameis'||9sName||'gongzuois'||sJob);10exception11whenno_data_foundthen12dbms_output.put_line('nodata');13whentoo_many_rowsthen14dbms_output.put_line('toomanydata');15whenothersthen16dbms_output.put_line('error');17end;18/过程已创建。。【例7.5】执行queryEmpName过程。SQL>execqueryEmpName('7900');IDis7900dezhigongnameisJAMESgongzuoisCLERK同样,也可通通过匿名块调调用过程queryEmpName。SQL>Begin2queryEmpName('7900');3end;4/2)创建带带OUT模式式参数的过程程【例7.6】创建一个过程程,以雇员号号查询雇员的的薪水。SQL>createorreplaceprocedurequeryEmpSal(sFindNoemp.EmpNo%type,v_saloutemp.sal%type)2as3begin4selectsalintov_salfromemp5whereempno=sFindNo;6dbms_output.put_line('Thesalaryof'||sFindNo||'is:'||v_sal);7exception8whenno_data_foundthen9dbms_output.put_line('nodata');10whentoo_many_rowsthen11dbms_output.put_line('toomanydata');12whenothersthen13dbms_output.put_line('error');14end;/过程已创建。。此过程带有一一个输入参数数sFindNo和输出参数v_sal,程序根据输输入参数到表表中查询记录录,以返回该该员工的薪水水值。【例7.7】执行queryEmpSal过程。可以声明一个个变量,用如如下的方式调调用该过程。。SQL>varsalarynumber;SQL>execqueryEmpSal('7900',:salary);Thesalaryof7900is:950PL/SQL过程已成功完完成。另外,也可以以从一个匿名名的PL/SQL程序中执行上上述过程,以以显示sal_out变量的输出结结果。以下代代码可以显示示queryEmpSal过程的返回值值。Declarevaluenumber;BeginqueryEmpSal(7934,value);DBMS_OUTPUT.PUT_LINE('VALUE的值为'||to_char(value));End;/3)创建带带INOUT模式参数数的过程【例7.8】创建两个数进进行交换的过过程。SQL>createorreplaceprocedureswap(p1INOUTnumber,p2INOUTnumber)2as3tempnumber;4begin5temp:=p1;6p1:=p2;7p2:=temp;8end;9/SQL>/过程已创建。。【例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权限,然后通通过点标记(dotnotation)(即“用户名.过程名”)来调用过程(数据字典是user_source)。以下演示如如何授权:SQL>GRANTEXECUTEONswapTOJohn;SQL>GRANTEXECUTEONqueryEmpNameTOPUBLIC;前者将swap过程的执行权权限授予John用户,后者将将queryEmpName的执行权限授授予所有数据据库用户。4.删除过程删除存储过程程的命令的一一般格式如下下:DROPPROCEDURE[<方案名>.]<存储过程名>;【例7.10】删除过程multiplication。SQL>DROPPROCEDUREmultiplication过程已丢弃。。函数函数与过程相相似,也是数数据库中存储储的已命名PL/SQL程序块。与过过程不同的是是,函数除了了完成一定的的功能外,还还必须返回一一个值。1.创建函数创建函数是指指通过RETURN子句指定函数数返回值的数数据类型。在在函数体的任任何地方,用用户都可以通通过RETURNexpression语句从函数返返回。定义函数的语语法如下:CREATE[ORREPLACE]FUNCTION[<方案名>.]<函数名>[parameterslist]RETURN<返回值类型>IS|AS[local_declarations];Beginexecutablestatements[exception][Exception_handlers]End;其中,FUNCTION为PL/SQL函数的关键字字。【例7.11】创建一个函数数,以雇员号号查询雇员的的姓名。SQL>createorreplacefunctiongetName(snovarchar2)2returnvarchar3is4namevarchar(12);5begin6selectenameintonamefromemp7whereempno=sno;8returnname;9exception10whentoo_many_rowsthen11dbms_output.put_line('toomanydata');12whenothersthen13dbms_output.put_line('error');14end;15/函数已创建。。2.执行函数及及授权1)在匿名名块中调用函数调用与过过程调用很相相似,在匿名名过程中通过过函数名(或参数)可以调用一个个函数。因为为过程没有显显式的RETURN语句,所以过过程调用可以以是一条单独独的语句,写写在单独的行行中。而函数数则必须有一一个返回值,,所以函数调调用要借助于于可执行语句句来完成,例例如赋值语句句、选择语句句和输出语句句。下面的例例子通过匿名名过程调用getname函数,将雇员员号作为参数数,此函数将将雇员姓名传传给调用块,,然后显示雇雇员姓名。【例7.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')fromdual;GETNAME('7369')------------------------SMITH【例7.14】从雇雇员员表表中中查查找找雇雇员员号号为为““7369”的的雇雇员员信信息息。。SQL>Select*fromempwhereename=getname(‘‘7369’’);EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO--------------------------------------------------7369SMITHCLERK790217-12月-80800203.函函数数的的授授权权与过过程程一一样样,,只只有有创创建建函函数数的的用用户户和和管管理理员员才才有有权权使使用用函函数数,,其其他他用用户户如如果果要要调调用用函函数数,,则则需需要要得得到到该该函函数数的的EXECUTE权限限。。【例7.15】将getname函数数的的执执行行权权限限授授予予John用户户。。SQL>GRANTEXECUTEONgetnameTOJohn;4.删删除除函函数数删除除函函数数的的命命令令的的一一般般格格式式如如下下::DROPFUNCTION[<方案案名名>.]<函数数名名>;【例7.16】删除除函函数数getname。SQL>DROPFUNCTIONgetname;过程程和和函函数数的的比比较较表7-1过程程和和函函数数的的比比较较7.2程序包程序序包包概概述述程序序包包是是数数据据库库中中的的一一个个实实体体,,包包含含一一系系列列公公共共常常量量、、变变量量、、数数据据类类型型、、游游标标、、过过程程及及函函数数的的定定义义。。使使用用包包更更加加体体现现了了模模块块化化编编程程的的优优点点,,使使得得开开发发工工作作能能灵灵活活自自如如地地进进行行。。程程序序包包包包括括两两个个部部分分::程程序序包包规规范范说说明明部部分分和和程程序序包包主主体体部部分分。。1.程程序序包包规规范范说说明明部部分分该部部分分相相当当于于一一个个包包的的头头,,类类似似于于接接口口,,可可以以对对包包的的部部件件作作简简单单说说明明。。其其中中的的过过程程、、函函数数、、变变量量、、常常量量和和游游标标都都是是公公共共的的,,可可在在应应用用程程序序中中访访问问。。(1)使用用createpackage进行行创创建建。。(2)包含含公公用用对对象象和和类类型型。。(3)声明明类类型型、、变变量量、、常常量量、、异异常常、、游游标标和和子子程程序序。。(4)可以以在在没没有有程程序序包包主主体体部部分分的的情情况况下下存存在在。。2.程程序序包包主主体体部部分分(1)使用用createpackagebody进行行创创建建。。(2)包含含子子程程序序和和游游标标的的定定义义。。(3)包含含私私有有声声明明。。(4)不能能在在没没有有程程序序包包规规格格说说明明的的情情况况下下存存在在。。创建建程程序序包包程序序包包包包括括两两部部分分::规规范范和和主主体体。。规规范范是是程程序序包包的的公公共共接接口口;;主主体体是是规规范范的的实实现现,,以以及及私私有有例例程程、、数数据据和和变变量量。。1.创创建建程程序序包包规规范范CREATEORREPLACEPACKAGEpackage_nameIS|AS公用用类类型型或或变变量量常常量量的的声声明明;;公用过程程或函数数的声明明;ENDpackage_name;/2.创建程程序包主主体CREATEORREPLACEPACKAGEBODYpackage_nameIS|AS私有类型型或变量量常量的的声明;;公用过程程或函数数的实现现;ENDpackage_name规范是程程序包的的接口,,规范中中定义的的所有内内容都可可以由调调用者使使用(当然需要要具有EXECUTE特权),比如规规范中定定义的过过程函数数可以被被执行,,类型可可以被访访问,变变量可以以被引用用。【例7.17】使用两个个过程print_ename()和print_sal(),定义名名为employee_pkg的程序包包。SQL>CREATEORREPLACE2PACKAGEemployee_pkgas3Procedureprint_ename(p_empnonumber);4Procedureprint_sal(p_empnonumber);5End;6/程序包已已创建。。此时并没没有为过过程提供供代码,,只是定定义了名名称和参参数。这个时候候如果试试图使用用这个包包,则会会报错。。SQL>execemployee_pkg.print_ename(1234);ERROR位于第1行:ORA-04068:已丢弃程程序包的的当前状状态ORA-04067:未执行,,packagebody"SCOTT.EMPLOYEE_PKG"不存在ORA-06508:PL/SQL:无法在调调用之前前找到程程序单元元ORA-06512:在line1程序包是是过程函函数的具具体实现现部分,,实现规规范中定定义的接接口。SQL>CREATEORREPLACE2PACKAGEBODYemployee_pkgas3Procedureprint_ename(p_empnonumber)is4L_enameemp.ename%type;5Begin6Selectenameintol_enamefromempwhereempno=p_empno;7Dbms_output.put_line(l_ename);8Exception9Whenno_data_foundthen10Dbms_output.put_line('Invalidemployeenumber');11Endprint_ename;12Procedureprint_sal(p_empnonumber)is13L_salemp.sal%type;14Begin15Selectsalintol_salfromempwhereempno=p_empno;16Dbms_output.put_line(l_sal);17Exception18WhenNO_DATA_FOUNDthen19Dbms_output.put_line('Invalidemployeenumber');20Endprint_sal;21Endemployee_pkg;22/程序包主主体已创创建。执行程序序包执行程序序包中的的过程可可以使用用如下语语句:EXECUTE包名.过程名【例7.18】执行employee_pkg包里的print_ename过程。SQL>setserveroutputonSQL>execemployee_pkg.print_ename(7782);运行结结果如如下::CLARKPL/SQL过程已已成功功完成成。SQL>execemployee_pkg.print_sal(7782);运行结结果如如下::2450PL/SQL过程已已成功功完成成。执行程程序包包中的的函数数可以以通过过一段段代码码块来来实现现。程序包包中的的游标标程序包包中可可以定定义和和使用用游标标。游游标的的定义义分为为游标标规范范和游游标主主体两两部分分。在在游标标规范范说明明部分分必须须通过过RETURN语句指指定游游标的的返回回类型型。RETURN语句指指定游游标获获取和和返回回的数数据元元素由由select语句确确定。。select语句只只出现现在主主体定定义中中,而而不出出现在在规范范说明明中。。【例7.19】下面使使用程程序包包中的的游标标。student_package程序包包中包包含4个过程程和1个函数数。其其中,,select_student过程中中使用用了游游标。。详细细过程程如下下:(1)首先创创建student表结构构。SQL>createtablestudent(stuidvarchar2(4),stunamevarchar2(10),sechar(1));表已创创建。。(2)定义声声明。。SQL>createorreplacepackagestudent_packageis2typestudent_curisrefcursorreturnstudent%rowtype;3procedureinsert_student(stuinstudent%rowtype);4procedureupdate_student(stustudent%rowtype);5proceduredelete_student(snostudent.stuid%type);6procedureselect_student(stucurinoutstudent_cur);7functiongetStudentCountreturnnumber;8endstudent_package;9/程序包包已创创建。。(3)定义主主体。。SQL>createorreplacepackagebodystudent_packageis2procedureinsert_student(stustudent%rowtype)is3icountint;4begin5selectcount(*)intoicountfromstudentwherestuid=stu.stuid;6ificount>0then7dbms_output.put_line('insertdataisalreadyexsist');8else9insertintostudentvalues(stu.stuid,stu.stuname,stu.se);10commit;11endif;12exception13whentoo_many_rowsthen14dbms_output.put_line('insertdataisalreadyexsist');15endinsert_student;16procedureupdate_student(stustudent%rowtype)is17icountint;18begin19selectcount(*)intoicountfromstudentwherestuid=stu.stuid;20ificount>0then21updatestudentsetstuname=stu.stuname,se=stu.sewherestuid=stu.stuid;22commit;23else24dbms_output.put_line('updatedatanotexist!');25endif;26endupdate_student;27proceduredelete_student(snostudent.stuid%type)is28icountint;29begin30ificount>0then31deletefromstudentwherestuid=sno;32commit;33else34dbms_output.put_line('deletedatanotexist');35endif;36enddelete_student;37procedureselect_student(stucurinoutstudent_cur)is38begin39openstucurforselect*fromstudent;40endselect_student;41functiongetStudentCountreturnnumberis42icountint;43begin44selectcount(*)intoicountfromstudent;45returnicount;46endgetStudentCount;47endstudent_package;48/程序包主体体已创建。。(4)调用程序包包插入一行行数据。SQL>declare2stustudent%rowtype;3begin4stu.stuid:=1009;5stu.stuname:='tonglei';6stu.se:='f';7student_package.insert_student(stu);8end;9/PL/SQL过程已成功功完成。(5)调用程序包包中的过程程select_student显示数据。。SQL>varssrefcursor--定义游标变变量SQL>execstudent_package.select_student(:ss);PL/SQL过程已成功功完成。显示游标变变量内容如如下:SQL>printssSTUISTUNAMES-----------------1009tongleif程序包的优优点程序包的优优点如下::(1)模块化。包包可以使逻逻辑上相关关联的类型型、项目和和子程序等等封装进一一个命名PL/SQL块中。每个个包划分功功能清晰,,包的接口口简单、明明了。(2)可重用性。。一旦命名名并保存在在数据库中中,任何应应用都可以以使用。(3)简单的应用用程序设计计。当设计计应用程序序时,只需需知道包的的接口部分分的信息,,可以只创创建并编译译包的规范范而不创建建包体。同同样可以在在程序中引引用包,等等整个应用用程序完成成后再来定定义具体的的包体。(4)抽象和数据据隐藏。可可以指定公公有信息和和私有信息息。只有公公有信息才才可以被外外部应用程程序访问。。(5)更好的执行行效能。包包里的子程程序第一次次被调用时时,整个包包被调到内内存中,以以后的调用用就可以直直接从内存存中读取。。这样可以以减少不必必要的重新新编译。有关子程序序和程序包包的信息子程序和程程序包是数数据库中存存储的对象象,Oracle会在数据字字典中存储储所有对象象的信息。。通过查询询数据字典典可以获得得它们的信信息。通过过查询USER_OBJECTS数据字典视视图可以获获取有关在在会话中创创建的字程程序和程序序包的信息息。【例7.20】获取程序包包中子程序序和程序包包的信息。。SQL>COLUMNOBJECT_NAMEFORMATA18SQL>SELECTOBJECT_NAME,OBJECT_TYPEFROMUSER_OBJECTSWHEREOBJECT_TYPEIN('PROCEDURE','FUNCTION','PACKAGE','PACKAGEBODY');OBJECT_NAMEOBJECT_TYPE---------------------------EMPLOYEE_PKGPACKAGEEMPLOYEE_PKGPACKAGEBODYQUERYEMPNAMEPROCEDUREQUERYEMPSALPROCEDURESWAPPROCEDURE【例7.21】要获取存储储子程序的的文本,可可以查询USER_SOURCE。SQL>COLUMNLINEFORMAT9999SQL>COLUMNTEXTFORA50SQL>SELECTLINE,TEXTFROMUSER_SOURCEWHERENAME=’’SWAP’’;LINETEXT-------------------------------------------1procedureswap(p1INOUTnumber,p2INOUTnumber)2as3tempnumber;4begin5temp:=p1;6p1:=p2;7p2:=temp;8end;【例7.22】获得得程程序序包包中中子子程程序序规规范范employee_pkg信息息。。SQL>DESCemployee_pkg;PROCEDUREPRINT_ENAME7.3小结过程程、、函函数数和和子子程程序序都都可可以以用用于于执执行行对对数数据据库库的的操操作作,,可可以以带带上上用用户户自自定定义义的的参参数数。。它它们们封封装装了了数数据据类类型型定定义义、、变变量量说说明明、、游游标标、、异异常常等等,,方方便便了了用用户户管管理理操操纵纵数数据据库库数数据据。。习题题七七一、、选选择择题题1.执执行行特特定定任任务务的的子子程程序序是是()。A.函数数B.过程程C.程序序包包D.游标标2.子子程程序序的的()模式式参参数数可可以以在在调调用用子子程程序序时时指指定定一一个个常常量量。。A.INB.OUTC.INOUT3.如果存储过程程的参数类型型为OUT,那么调用时时传递的参数数应该为()。A.常量B.表达式C.变量D.都可以4.下列有关存存储过程的特特点,说法错错误的是()。A.存储过程不能能将值传回调调用的主程序序B.存储过程是一一个命名的模模块C.编译的存储过过程存放在数数据库中D.一个存储过程程可以调用另另一个存储过过程5.包中不能包包含的元素为为()。A.存储过程B.存储函数C.游标D.表6.下列有关包包的使用,说说法错误的是是()。A.在不同的包内内模块可以重重名B.包的私有过程程不能被外部部程序调用C.包体中的过程程和函数必须须在包头部分分说明D.必须先创建包包头,然后创创建包体二、编程题1.编写程序包包,此程序包包有两个过程程和一个函数数,第一个过过程根据职员员编号打印职职员姓名,第第二个过程根根据职员编号号打印职员的的部门编号。。函数根据职职员编号返回回职员的薪水水。提示:使用scott用户的emp表作为数据源源。2.编写函数接接受学生的学学号,并计算算该学生3门课程的总分分。3.编写一个过过程,将10号部门员工薪薪水上涨10%,20号部门员工薪薪水上涨20%,其他部门员员工薪水保持持不变。上机实验七实验1过程目的和要求::1.掌握编写过过程的方法。。2.掌握调用过过程的方法。。实验内容:编写一个过程程,要求根据据用户输入的的员工号(emp_no)查询EMP表,返回员工工的姓名和工工作职位(empName和empJob)。并编写一个个匿名块调用用此过程(使用SCOTT用户的EMP表)。SQL>createorreplaceprocedurepro_emp(emp_nonumber)2as3empNamevarchar2(20);4empJobvarchar2(20);5begin6selectename,jobintoempName,empJobfromempwhereempno=emp_no;7DBMS_OUTPUT.PUT_LINE('雇员的姓名是是:'||empName);8DBMS_OUTPUT.PUT_LINE('雇员的职位是是:'||empJob);9EXCEPTION10whenNO_DATA_FOUNDthen11DBMS_OUTPUT.PUT_LINE('雇员编号未找找到!');12endpro_emp;13/过程已创建。。SQL>setserveroutputon;SQL>executepro_emp(7369);雇员的姓名是是:SMITH雇员的职位是是:CLERKPL/SQL过程已成功完完成。实验2函数目的和要求::1.掌握编写函函数的方法。。2.掌握调用函函数的方法。。实验内容:1.编写函数以以接受学生的的学号,并计计算此学生3门课程的平均均分。SQL>createorreplacefunctionfun_score(student_nonumber)2returnfloat3as4s1float(10);5s2float(10);6s3float(10);7score_avgfloat(10);8begin9selectoracle,java,csharpintos1,s2,s3fromscorewherestuID=student_no;10s

温馨提示

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

评论

0/150

提交评论