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过程程已已丢丢弃弃。。7.1.2函数数函数数与与过过程程相相似似,,也也是是数数据据库库中中存存储储的的已已命命名名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.3过程和函数的的比较表7-1过程和函数的的比较7.2程序包7.2.1程序包概述程序包是数据据库中的一个个实体,包含含一系列公共共常量、变量量、数据类型型、游标、过过程及函数的的定义。使用用包更加体现现了模块化编编程的优点,,使得开发工工作能灵活自自如地进行。。程序包包括括两个部分::程序包规范范说明部分和和程序包主体体部分。1.程序包规范范说明部分该部分相当于于一个包的头头,类似于接接口,可以对对包的部件作作简单说明。。其中的过程程、函数、变变量、常量和和游标都是公公共的,可在在应用程序中中访问。(1)使用createpackage进行创建。(2)包含公用对象象和类型。(3)声明类型、变变量、常量、、异常、游标标和子程序。。(4)可以在没有程程序包主体部部分的情况下下存在。2.程序包主体体部分(1)使用createpackagebody进行创建。(2)包含子程序和和游标的定义义。(3)包含私有声明明。(4)不能在没有程程序包规格说说明的情况下下存在。7.2.2创建程序包程序包包括两两部分:规范范和主体。规规范是程序包包的公共接口口;主体是规规范的实现,,以及私有例例程、数据和和变量。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/程序包主体体已创建。。7.2.3执行程序包包执行程序包包中的过程程可以使用用如下语句句:EXECUTE包名.过程名【例7.18】执行employee_pkg包里的print_ename过程。SQL>setserveroutputonSQL>execemployee_pkg.print_ename(7782);运行结果如如下:CLARKPL/SQL过程已成功功完成。SQL>execemployee_pkg.print_sal(7782);运行结果如如下:2450PL/SQL过程已成功功完成。执行程序包包中的函数数可以通过过一段代码码块来实现现。7.2.4程序包中的的游标程序包中可可以定义和和使用游标标。游标的的定义分为为游标规范范和游标主主体两部分分。在游标标规范说明明部分必须须通过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-----------------1009tongleif7.2.5程序包的优点点程序包的优点点如下:(1)模块化。包可可以使逻辑上上相关联的类类型、项目和和子程序等封封装进一个命命名PL/SQL块中。每个包包划分功能清清晰,包的接接口简单、明明了。(2)可重用性。一一旦命名并保保存在数据库库中,任何应应用都可以使使用。(3)简单的应用程程序设计。当当设计应用程程序时,只需需知道包的接接口部分的信信息,可以只只创建并编译译包的规范而而不创建包体体。同样可以以在程序中引引用包,等整整个应用程序序完成后再来来定义具体的的包体。(4)抽象和数据隐隐藏。可以指指定公有信息息和私有信息息。只有公有有信息才可以以被外部应用用程序访问。。(5)更好的执行效效能。包里的的子程序第一一次被调用时时,整个包被被调到内存中中,以后的调调用就可以直直接从内存中中读取。这样样可以减少不不必要的重新新编译。7.2.6有关子程序和和程序包的信信息子程序和程序序包是数据库库中存储的对对象,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,s3froms

温馨提示

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

评论

0/150

提交评论