Oracle 数据库应用教程课件 第7章

上传人:zhan****gclb 文档编号:123882099 上传时间:2022-07-23 格式:PPTX 页数:79 大小:476.89KB
返回 下载 相关 举报
Oracle 数据库应用教程课件 第7章_第1页
第1页 / 共79页
Oracle 数据库应用教程课件 第7章_第2页
第2页 / 共79页
Oracle 数据库应用教程课件 第7章_第3页
第3页 / 共79页
点击查看更多>>
资源描述
第第7 7章章 过程、函数和程序包过程、函数和程序包第第7章章 过程、函数和程序包过程、函数和程序包 7.1 子程序子程序 7.2 程序包程序包 7.3 小结小结 习题七习题七 上机实验七上机实验七 第第7 7章章 过程、函数和程序包过程、函数和程序包7.1 7.1 子子 程程 序序 以前我们写的PL/SQL语句程序都是瞬时的,都没有命名。其缺点是:在每次执行的时候都要被编译,并且不能被存储在数据库中,其他PL/SQL块也无法调用它们。现在我们把命名的PL/SQL块叫做子程序,它们存储在数据库中,可以为它们指定参数,可以在数据库客户端和应用程序中调用。命名的PL/SQL程序包括存储过程和函数。程序包是存储过程和函数的集合。子程序结构与PL/SQL匿名块的相同点在于都由声明、执行、异常三大部分构成,不同之处在于,PL/SQL匿名块的声明可选,而子程序的声明则是必需的。第第7 7章章 过程、函数和程序包过程、函数和程序包子程序的优点如下:(1)模块化:通过子程序可以将程序分解为可管理的、明确的逻辑模块。(2)可重用性:子程序在创建并执行后,就可以在任何应用程序中使用。(3)可维护性:子程序可以简化维护操作。(4)安全性:用户可以设置权限,保护子程序中的数据,只能让用户提供的过程和函数访问数据。这不仅可以让数据更加安全,同时可保证正确性。子程序有两种类型:过程和函数。其中,过程用于执行某项操作;函数用于执行某项操作并返回值。第第7 7章章 过程、函数和程序包过程、函数和程序包7.1.1 7.1.1 过程过程1过程的创建和执行过程的创建和执行过程可使用create procedure语句创建,语法如下:create or replace procedure.parameter list Is|as local_declarations;Begin executable statementsexception Exception_handlers End procedure_name;第第7 7章章 过程、函数和程序包过程、函数和程序包保留字Is前面的过程定义称为过程头。过程头包括过程名和具有数据类型的参数列表。过程体包括声明部分、执行部分和异常处理部分。过程体从保留字Is之后开始。其中,声明部分和异常处理部分是可选的;执行部分至少包含一条语句。这里的Is|as就相当于declare声明部分,除了拥有前面的一个过程声明语句外,其他和以前的匿名PL/SQL块一样。其中,replace表示在创建存储过程中,如果已经存在同名的存储过程,则重新创建;如果没有此关键词,则当数据库中有同名的过程时会报错“ORA-00955号错误:名称已被现有对象占用”。必须将同名的过程删除后才能创建。第第7 7章章 过程、函数和程序包过程、函数和程序包1)创建不带参数的过程。创建不带参数的过程。【例7.1】创建一个过程multiplication,用来实现九九乘法表。SQL create or replace procedure multiplication 2 as 3 i integer;4 j integer;5 begin 6 dbms_output.put_line(print multiplication);7 for i in 1.9 loop 8 for j in 1.9 loop 9 if i=j then 第第7 7章章 过程、函数和程序包过程、函数和程序包 10 dbms_output.put(to_char(j)|*|11 to_char(i)|=|to_char(i*j)|);12 end if;13 end loop;14 dbms_output.put_line();15 end loop;16 end;17 /过程已创建。出现编译错误的时候可以用show error或者desc user_errors来调试。第第7 7章章 过程、函数和程序包过程、函数和程序包2)执行过程执行过程创建过程的时候并不会执行过程,必须在这之后调用过程来执行。执行过程的方法有两种:一种是在SQL提示符下,使用execute语句来执行过程;另一种是在匿名块中调用。execute执行过程的语法如下:execute procedure_name(parameters_list);第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.2】执行multiplication过程。SQL set serverout on -将SQL*Plus的输出打开SQL execute multiplication -执行过程multiplication用execute命令。print multiplication1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*5=5 2*5=10 3*5=15 4*5=20 5*5=251*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=361*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=491*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=641*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81PL/SQL 过程已成功完成。第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.3】在匿名块中调用过程multiplication。SQL begin 2 multiplication;3 end;4 /程序运行结果同上。第第7 7章章 过程、函数和程序包过程、函数和程序包2创建带参数的过程创建带参数的过程调用程序通过参数可向被调用子程序传递值。在上述语法parameter list 中,参数的具体形式如下:参数1,方式1数据类型1,参数2,方式2数据类型2,参数方式有以下三种:(1)IN表示接受值为默认值。(2)OUT表示将值返回给子程序的调用程序。(3)IN OUT表示接受值并返回已更新的值。第第7 7章章 过程、函数和程序包过程、函数和程序包参数的书写格式为:(参数1 IN|OUT|IN OUT参数类型,参数2 IN|OUT|IN OUT参数类型,)。参数IN模式是默认模式。如果未指定参数的模式,则认为该参数是IN参数。对于OUT和IN OUT参数,必须明确指定,并且这两种类型的参数在返回到调用环境之前必须先赋值。IN参数可以在调用时赋默认值,而OUT参数和IN OUT参数不可以。第第7 7章章 过程、函数和程序包过程、函数和程序包1)创建带创建带IN模式参数的过程模式参数的过程【例7.4】创建一个过程,以雇员号为参数查询雇员的姓名和职位。SQL create or replace procedure queryEmpName(sFindNo emp.EmpNo%type)2 as 3 sName emp.ename%type;4 sJob emp.job%type;5 begin 6 select ename,job into sName,sJob from emp 7 where empno=sFindNo;8 dbms_output.put_line(ID is|sFindNo|de zhigong name is|第第7 7章章 过程、函数和程序包过程、函数和程序包 9 sName|gongzuo is|sJob);10 exception 11 when no_data_found then 12 dbms_output.put_line(no data);13 when too_many_rows then 14 dbms_output.put_line(too many data);15 when others then 16 dbms_output.put_line(error);17 end;18 /过程已创建。第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.5】执行queryEmpName过程。SQL exec queryEmpName(7900);ID is 7900 de zhigong name is JAMES gongzuo is CLERK同样,也可通过匿名块调用过程queryEmpName。SQL Begin 2 queryEmpName(7900);3 end;4 /第第7 7章章 过程、函数和程序包过程、函数和程序包2)创建带创建带OUT模式参数的过程模式参数的过程【例7.6】创建一个过程,以雇员号查询雇员的薪水。SQL create or replace procedure queryEmpSal(sFindNo emp.EmpNo%type,v_sal out emp.sal%type)2 as 3 begin 4 select sal into v_sal from emp 5 where empno=sFindNo;6 dbms_output.put_line(The salary of|sFindNo|is:|v_sal);第第7 7章章 过程、函数和程序包过程、函数和程序包 7 exception 8 when no_data_found then 9 dbms_output.put_line(no data);10 when too_many_rows then 11 dbms_output.put_line(too many data);12 when others then 13 dbms_output.put_line(error);14 end;/过程已创建。此过程带有一个输入参数sFindNo和输出参数v_sal,程序根据输入参数到表中查询记录,以返回该员工的薪水值。第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.7】执行queryEmpSal过程。可以声明一个变量,用如下的方式调用该过程。SQL var salary number;SQL exec queryEmpSal(7900,:salary);The salary of 7900is:950PL/SQL 过程已成功完成。第第7 7章章 过程、函数和程序包过程、函数和程序包另外,也可以从一个匿名的PL/SQL程序中执行上述过程,以显示sal_out变量的输出结果。以下代码可以显示queryEmpSal过程的返回值。Declare value number;Begin queryEmpSal(7934,value);DBMS_OUTPUT.PUT_LINE(VALUE的值为|to_char(value);End;/第第7 7章章 过程、函数和程序包过程、函数和程序包3)创建带创建带IN OUT模式参数的过程模式参数的过程【例7.8】创建两个数进行交换的过程。SQL create or replace procedure swap(p1 IN OUT number,p2 IN OUT number)2 as 3 temp number;4 begin 5 temp:=p1;6 p1:=p2;7 p2:=temp;8 end;9 /SQL/过程已创建。第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.9】执行swap过程。SQL Declare 2 N1 number:=10;3 N2 number:=20;4 Begin 5 swap(N1,N2);6 DBMS_OUTPUT.PUT_LINE(N1的值是|N1);7 DBMS_OUTPUT.PUT_LINE(N2的值是|N2);8 End;9 /N1的值是20N2的值是10PL/SQL 过程已成功完成。第第7 7章章 过程、函数和程序包过程、函数和程序包3过程的授权过程的授权只有创建过程的用户和管理员才有使用过程的权限,如以上示例,创建的过程就像创建的表一样,属于当前操作的用户,其他用户如果要调用过程,则需要得到该过程的EXECUTE权限,然后通过点标记(dot notation)(即“用户名.过程名”)来调用过程(数据字典是user_source)。以下演示如何授权:SQLGRANT EXECUTE ON swap TO John;SQLGRANT EXECUTE ON queryEmpName TO PUBLIC;前者将swap过程的执行权限授予John用户,后者将queryEmpName的执行权限授予所有数据库用户。第第7 7章章 过程、函数和程序包过程、函数和程序包4删除过程删除过程删除存储过程的命令的一般格式如下:DROP PROCEDURE .;【例7.10】删除过程 multiplication。SQL DROP PROCEDURE multiplication过程已丢弃。第第7 7章章 过程、函数和程序包过程、函数和程序包7.1.2 7.1.2 函数函数函数与过程相似,也是数据库中存储的已命名PL/SQL程序块。与过程不同的是,函数除了完成一定的功能外,还必须返回一个值。1创建函数创建函数创建函数是指通过RETURN子句指定函数返回值的数据类型。在函数体的任何地方,用户都可以通过RETURN expression语句从函数返回。第第7 7章章 过程、函数和程序包过程、函数和程序包定义函数的语法如下:CREATE OR REPLACE FUNCTION.parameters listRETURN IS|ASlocal_declarations;Begin executable statementsexception Exception_handlersEnd;其中,FUNCTION 为 PL/SQL函数的关键字。第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.11】创建一个函数,以雇员号查询雇员的姓名。SQL create or replace function getName(sno varchar2)2 return varchar 3 is 4 name varchar(12);5 begin 6 select ename into name from emp 7 where empno=sno;8 return name;9 exception 10 when too_many_rows then 11 dbms_output.put_line(too many data);12 when others then 13 dbms_output.put_line(error);14 end;15 /函数已创建。第第7 7章章 过程、函数和程序包过程、函数和程序包2执行函数及授权执行函数及授权1)在匿名块中调用在匿名块中调用函数调用与过程调用很相似,在匿名过程中通过函数名(或参数)可以调用一个函数。因为过程没有显式的RETURN语句,所以过程调用可以是一条单独的语句,写在单独的行中。而函数则必须有一个返回值,所以函数调用要借助于可执行语句来完成,例如赋值语句、选择语句和输出语句。下面的例子通过匿名过程调用getname函数,将雇员号作为参数,此函数将雇员姓名传给调用块,然后显示雇员姓名。第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.12】通过匿名过程调用getname函数。SQL declare 2 name varchar(12);3 begin 4 name:=getname(7902);5 dbms_output.put_line(name);6 end;7 /FORDPL/SQL 过程已成功完成。第第7 7章章 过程、函数和程序包过程、函数和程序包2)在在SQL语句中调用语句中调用除了在匿名块中调用外,也可以在SQL语句中调用函数。【例7.13】在SQL语句中调用getname,显示雇员号为“7369”的雇员姓名。SQL select getname(7369)from dual;GETNAME(7369)-SMITH 第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.14】从雇员表中查找雇员号为“7369”的雇员信息。SQL Select*from emp where ename=getname(7369);EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO -7369 SMITH CLERK 7902 17-12月-80 800 20 第第7 7章章 过程、函数和程序包过程、函数和程序包3函数的授权函数的授权与过程一样,只有创建函数的用户和管理员才有权使用函数,其他用户如果要调用函数,则需要得到该函数的EXECUTE权限。【例7.15】将getname函数的执行权限授予John用户。SQLGRANT EXECUTE ON getname TO John;第第7 7章章 过程、函数和程序包过程、函数和程序包4删除函数删除函数删除函数的命令的一般格式如下:DROP FUNCTION.;【例7.16】删除函数 getname。SQL DROP FUNCTION getname;第第7 7章章 过程、函数和程序包过程、函数和程序包7.1.3 过程和函数的比较过程和函数的比较 表7-1 过程和函数的比较 过 程 函 数 过程作为 PL/SQL 语句块来执行 函数作为表达式的一部分调用 在规则说明中不包含 return 语句 函数必须包含 RETURN 语句 不返回任何值 必须返回单个值 可以包含 RETURN 语句,但是与函数不同,不能返回值 必须包含至少一条 RETURN 语句 参数方式有 IN 模式、OUT 模式和 IN OUT 模式 一般只有输入参数模式 第第7 7章章 过程、函数和程序包过程、函数和程序包7.2 程程 序序 包包7.2.1 7.2.1 程序包概述程序包概述程序包是数据库中的一个实体,包含一系列公共常量、变量、数据类型、游标、过程及函数的定义。使用包更加体现了模块化编程的优点,使得开发工作能灵活自如地进行。程序包包括两个部分:程序包规范说明部分和程序包主体部分。第第7 7章章 过程、函数和程序包过程、函数和程序包1程序包规范说明部分程序包规范说明部分该部分相当于一个包的头,类似于接口,可以对包的部件作简单说明。其中的过程、函数、变量、常量和游标都是公共的,可在应用程序中访问。(1)使用create package进行创建。(2)包含公用对象和类型。(3)声明类型、变量、常量、异常、游标和子程序。(4)可以在没有程序包主体部分的情况下存在。第第7 7章章 过程、函数和程序包过程、函数和程序包2程序包主体部分程序包主体部分(1)使用create package body进行创建。(2)包含子程序和游标的定义。(3)包含私有声明。(4)不能在没有程序包规格说明的情况下存在。第第7 7章章 过程、函数和程序包过程、函数和程序包7.2.2 7.2.2 创建程序包创建程序包程序包包括两部分:规范和主体。规范是程序包的公共接口;主体是规范的实现,以及私有例程、数据和变量。1创建程序包规范创建程序包规范CREATE OR REPLACE PACKAGE package_name IS|AS 公用类型或变量常量的声明;公用过程或函数的声明;END package_name;/第第7 7章章 过程、函数和程序包过程、函数和程序包2创建程序包主体创建程序包主体CREATE OR REPLACE PACKAGE BODY package_name IS|AS 私有类型或变量常量的声明;公用过程或函数的实现;END package_name 规范是程序包的接口,规范中定义的所有内容都可以由调用者使用(当然需要具有EXECUTE特权),比如规范中定义的过程函数可以被执行,类型可以被访问,变量可以被引用。第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.17】使用两个过程print_ename()和print_sal(),定义名为employee_pkg的程序包。SQL CREATE OR REPLACE 2 PACKAGE employee_pkg as 3 Procedure print_ename(p_empno number);4 Procedure print_sal(p_empno number);5 End;6 /程序包已创建。第第7 7章章 过程、函数和程序包过程、函数和程序包此时并没有为过程提供代码,只是定义了名称和参数。这个时候如果试图使用这个包,则会报错。SQL exec employee_pkg.print_ename(1234);ERROR 位于第 1 行:ORA-04068:已丢弃程序包的当前状态ORA-04067:未执行,package body SCOTT.EMPLOYEE_PKG 不存在ORA-06508:PL/SQL:无法在调用之前找到程序单元ORA-06512:在line 1 第第7 7章章 过程、函数和程序包过程、函数和程序包程序包是过程函数的具体实现部分,实现规范中定义的接口。SQL CREATE OR REPLACE 2 PACKAGE BODY employee_pkg as 3 Procedure print_ename(p_empno number)is 4 L_ename emp.ename%type;5 Begin 6 Select ename into l_ename from emp where empno=p_empno;7 Dbms_output.put_line(l_ename);第第7 7章章 过程、函数和程序包过程、函数和程序包 8 Exception 9 When no_data_found then 10 Dbms_output.put_line(Invalid employee number);11 End print_ename;12 Procedure print_sal(p_empno number)is 13 L_sal emp.sal%type;14 Begin 15 Select sal into l_sal from emp where empno=p_empno;16 Dbms_output.put_line(l_sal);第第7 7章章 过程、函数和程序包过程、函数和程序包 17 Exception 18 When NO_DATA_FOUND then 19 Dbms_output.put_line(Invalid employee number);20 End print_sal;21 End employee_pkg;22 /程序包主体已创建。第第7 7章章 过程、函数和程序包过程、函数和程序包7.2.3 7.2.3 执行程序包执行程序包执行程序包中的过程可以使用如下语句:EXECUTE 包名.过程名【例7.18】执行employee_pkg包里的print_ename过程。SQLset serveroutput on SQL exec employee_pkg.print_ename(7782);运行结果如下:CLARKPL/SQL 过程已成功完成。SQLexec employee_pkg.print_sal(7782);运行结果如下:2450PL/SQL 过程已成功完成。执行程序包中的函数可以通过一段代码块来实现。第第7 7章章 过程、函数和程序包过程、函数和程序包7.2.4 7.2.4 程序包中的游标程序包中的游标程序包中可以定义和使用游标。游标的定义分为游标规范和游标主体两部分。在游标规范说明部分必须通过RETURN语句指定游标的返回类型。RETURN语句指定游标获取和返回的数据元素由select语句确定。select语句只出现在主体定义中,而不出现在规范说明中。第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.19】下面使用程序包中的游标。student_package程序包中包含4个过程和1个函数。其中,select_student过程中使用了游标。详细过程如下:(1)首先创建student表结构。SQLcreate table student(stuid varchar2(4),stuname varchar2(10),se char(1);表已创建。第第7 7章章 过程、函数和程序包过程、函数和程序包(2)定义声明。SQL create or replace package student_package is 2 type student_cur is ref cursor return student%rowtype;3 procedure insert_student(stu in student%rowtype);4 procedure update_student(stu student%rowtype);5 procedure delete_student(sno student.stuid%type);6 procedure select_student(stucur in out student_cur);7 function getStudentCount return number;8 end student_package;9 /程序包已创建。第第7 7章章 过程、函数和程序包过程、函数和程序包(3)定义主体。SQL create or replace package body student_package is 2 procedure insert_student(stu student%rowtype)is 3 icount int;4 begin 5 select count(*)into icount from student where stuid=stu.stuid;6 if icount0 then 7 dbms_output.put_line(insert data is already exsist);8 else 9 insert into student values(stu.stuid,stu.stuname,stu.se);10 commit;11 end if;第第7 7章章 过程、函数和程序包过程、函数和程序包 12 exception 13 when too_many_rows then 14 dbms_output.put_line(insert data is already exsist);15 end insert_student;16 procedure update_student(stu student%rowtype)is 17 icount int;18 begin 19 select count(*)into icount from student where stuid=stu.stuid;20 if icount0 then 21 update student set stuname=stu.stuname,se=stu.se where stuid=stu.stuid;第第7 7章章 过程、函数和程序包过程、函数和程序包 22 commit;23 else 24 dbms_output.put_line(update data not exist!);25 end if;26 end update_student;27 procedure delete_student(sno student.stuid%type)is 28 icount int;29 begin 30 if icount0 then 31 delete from student where stuid=sno;32 commit;33 else 第第7 7章章 过程、函数和程序包过程、函数和程序包 34 dbms_output.put_line(delete data not exist);35 end if;36 end delete_student;37 procedure select_student(stucur in out student_cur)is 38 begin 39 open stucur for select*from student;40 end select_student;41 function getStudentCount return number is 42 icount int;43 begin 44 select count(*)into icount from student;45 return icount;46 end getStudentCount;47 end student_package;48 /程序包主体已创建。第第7 7章章 过程、函数和程序包过程、函数和程序包(4)调用程序包插入一行数据。SQL declare 2 stu student%rowtype;3 begin 4 stu.stuid:=1009;5 stu.stuname:=tonglei;6 stu.se:=f;7 student_package.insert_student(stu);8 end;9 /PL/SQL 过程已成功完成。第第7 7章章 过程、函数和程序包过程、函数和程序包(5)调用程序包中的过程select_student显示数据。SQL var ss refcursor -定义游标变量SQL exec student_package.select_student(:ss);PL/SQL 过程已成功完成。显示游标变量内容如下:SQL print ssSTUI STUNAME S-1009 tonglei f 第第7 7章章 过程、函数和程序包过程、函数和程序包7.2.5 7.2.5 程序包的优点程序包的优点程序包的优点如下:(1)模块化。包可以使逻辑上相关联的类型、项目和子程序等封装进一个命名PL/SQL块中。每个包划分功能清晰,包的接口简单、明了。(2)可重用性。一旦命名并保存在数据库中,任何应用都可以使用。(3)简单的应用程序设计。当设计应用程序时,只需知道包的接口部分的信息,可以只创建并编译包的规范而不创建包体。同样可以在程序中引用包,等整个应用程序完成后再来定义具体的包体。第第7 7章章 过程、函数和程序包过程、函数和程序包(4)抽象和数据隐藏。可以指定公有信息和私有信息。只有公有信息才可以被外部应用程序访问。(5)更好的执行效能。包里的子程序第一次被调用时,整个包被调到内存中,以后的调用就可以直接从内存中读取。这样可以减少不必要的重新编译。第第7 7章章 过程、函数和程序包过程、函数和程序包7.2.6 7.2.6 有关子程序和程序包的信息有关子程序和程序包的信息子程序和程序包是数据库中存储的对象,Oracle会在数据字典中存储所有对象的信息。通过查询数据字典可以获得它们的信息。通过查询USER_OBJECTS数据字典视图可以获取有关在会话中创建的字程序和程序包的信息。第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.20】获取程序包中子程序和程序包的信息。SQLCOLUMN OBJECT_NAME FORMAT A18SQL SELECT OBJECT_NAME,OBJECT_TYPE FROM USER_OBJECTS WHERE OBJECT_TYPE IN(PROCEDURE,FUNCTION,PACKAGE,PACKAGE BODY);OBJECT_NAME OBJECT_TYPE-EMPLOYEE_PKG PACKAGEEMPLOYEE_PKG PACKAGE BODYQUERYEMPNAME PROCEDUREQUERYEMPSAL PROCEDURESWAP PROCEDURE 第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.21】要获取存储子程序的文本,可以查询USER_SOURCE。SQLCOLUMN LINE FORMAT 9999SQLCOLUMN TEXT FOR A50SQLSELECT LINE,TEXT FROM USER_SOURCE WHERE NAME=SWAP;LINE TEXT -1 procedure swap(p1 IN OUT number,p2 IN OUT number)2 as 3 temp number;4 begin 5 temp:=p1;6 p1:=p2;7 p2:=temp;8 end;第第7 7章章 过程、函数和程序包过程、函数和程序包【例7.22】获得程序包中子程序规范employee_pkg信息。SQL DESC employee_pkg;PROCEDURE PRINT_ENAME参数名称 类型 输入/输出默认值?-P_EMPNO NUMBER IN PROCEDURE PRINT_SAL 参数名称 类型 输入/输出默认值?-P_EMPNO NUMBER IN 第第7 7章章 过程、函数和程序包过程、函数和程序包7.3 小小 结结 过程、函数和子程序都可以用于执行对数据库的操作,可以带上用户自定义的参数。它们封装了数据类型定义、变量说明、游标、异常等,方便了用户管理操纵数据库数据。第第7 7章章 过程、函数和程序包过程、函数和程序包习题七一、选择题一、选择题1执行特定任务的子程序是()。A.函数 B.过程 C.程序包 D.游标2子程序的()模式参数可以在调用子程序时指定一个常量。A.IN B.OUT C.IN OUT 3.如果存储过程的参数类型为OUT,那么调用时传递的参数应该为()。A.常量B.表达式 C.变量 D.都可以 第第7 7章章 过程、函数和程序包过程、函数和程序包4下列有关存储过程的特点,说法错误的是()。A.存储过程不能将值传回调用的主程序B.存储过程是一个命名的模块C.编译的存储过程存放在数据库中D.一个存储过程可以调用另一个存储过程5包中不能包含的元素为()。A.存储过程 B.存储函数 C.游标 D.表 第第7 7章章 过程、函数和程序包过程、函数和程序包6下列有关包的使用,说法错误的是()。A.在不同的包内模块可以重名B.包的私有过程不能被外部程序调用C.包体中的过程和函数必须在包头部分说明D.必须先创建包头,然后创建包体 第第7 7章章 过程、函数和程序包过程、函数和程序包二、编程题二、编程题1编写程序包,此程序包有两个过程和一个函数,第一个过程根据职员编号打印职员姓名,第二个过程根据职员编号打印职员的部门编号。函数根据职员编号返回职员的薪水。提示:使用scott用户的emp表作为数据源。2编写函数接受学生的学号,并计算该学生3门课程的总分。3编写一个过程,将10号部门员工薪水上涨10%,20号部门员工薪水上涨20%,其他部门员工薪水保持不变。第第7 7章章 过程、函数和程序包过程、函数和程序包上机实验七 实验1 过程目的和要求:1掌握编写过程的方法。2掌握调用过程的方法。实验内容:编写一个过程,要求根据用户输入的员工号(emp_no)查询EMP表,返回员工的姓名和工作职位(empName和empJob)。并编写一个匿名块调用此过程(使用SCOTT用户的EMP表)。第第7 7章章 过程、函数和程序包过程、函数和程序包SQL create or replace procedure pro_emp(emp_no number)2 as 3 empName varchar2(20);4 empJob varchar2(20);5 begin 6 select ename,job into empName,empJob from emp where empno=emp_no;7 DBMS_OUTPUT.PUT_LINE(雇员的姓名是:|empName);8 DBMS_OUTPUT.PUT_LINE(雇员的职位是:|empJob);9 EXCEPTION 10 when NO_DATA_FOUND then 11 DBMS_OUTPUT.PUT_LINE(雇员编号未找到!);12 end pro_emp;13 /第第7 7章章 过程、函数和程序包过程、函数和程序包过程已创建。SQL set serveroutput on;SQL execute pro_emp(7369);雇员的姓名是:SMITH雇员的职位是:CLERKPL/SQL 过程已成功完成。第第7 7章章 过程、函数和程序包过程、函数和程序包实验实验2 2 函数函数目的和要求:1掌握编写函数的方法。2掌握调用函数的方法。第第7 7章章 过程、函数和程序包过程、函数和程序包实验内容:1编写函数以接受学生的学号,并计算此学生3门课程的平均分。SQL create or replace function fun_score(student_no number)2 return float 3 as 4 s1 float(10);5 s2 float(10);6 s3 float(10);7 score_avg float(10);8 begin 9 select oracle,java,csharp into s1,s2,s3 from score where stuID=student_no;第第7 7章章 过程、函数和程序包过程、函数和程序包 10 score_avg:=(s1+s2+s3)/3.0;11 return score_avg;12 EXCEPTION 13 when NO_DATA_FOUND then 14 DBMS_OUTPUT.PUT_LINE(学号未找到!);15 end;16 /函数已创建。SQL set serveroutput on;SQL declare 第第7 7章章 过程、函数和程序包过程、函数和程序包 2 score_avg float(10);3 begin 4 score_avg:=fun_score(1);5 DBMS_OUTPUT.PUT_LINE(该学生的成绩是:|score_avg);6 end;7 /该学生的成绩是:62.67PL/SQL 过程已成功完成。第第7 7章章 过程、函数和程序包过程、函数和程序包2编写一个函数,要求根据用户输入的部门号查询DEPT表。如果存在这个部门号,则返回TRUE,否则返回FALSE。在调用程序中根据结果显示正确的消息(使用SCOTT用户的DEPT表)。第第7 7章章 过程、函数和程序包过程、函数和程序包实验3 程序包目的和要求:1掌握程序包的编写规范。2掌握执行程序包中过程和函数的方法。实验内容:1编写一个程序包,此程序包有一个过程和一个函数。过程根据职员编号打印薪水。函数根据职员编号返回职员的就职日期。编写调用程序执行(使用SCOTT用户的emp表)。第第7 7章章 过程、函数和程序包过程、函数和程序包SQL create or replace package pack_emp 2 is 3 procedure pro_salary(emp_no number);4 function fun_date(emp_no number)return date;5 end pack_emp;6 /程序包已创建。SQL create or replace package body pack_emp 2 as 3 procedure pro_salary(emp_no number)4 is第第7 7章章 过程、函数和程序包过程、函数和程序包 5 salary number(20);6 begin 7 select sal into salary from emp where empno=emp_no;8 DBMS_OUTPUT.PUT_LINE(该职员的薪水是:|salary);9 EXCEPTION 10 when NO_DATA_FOUND then 11 DBMS_OUTPUT.PUT_LINE(职员编号未找到!);12 end pro_salary;13 function fun_date(emp_no number)14 return date 15 is 16 h_date date;第第7 7章章 过程、函数和程序包过程、函数和程序包 17 begin 18 select hiredate into h_date from emp where empno=emp_no;19 return h_date;20 EXCEPTION 21 when NO_DATA_FOUND then 22 DBMS_OUTPUT.PUT_LINE(职员编号未找到!);23 end fun_date;24 end pack_emp;25 /第第7 7章章 过程、函数和程序包过程、函数和程序包程序包主体已创建。SQL set serveroutput on;SQL execute pack_emp.pro_salary(7369);该职员的薪水是:800PL/SQL 过程已成功完成。SQL set serveroutput on;SQL declare 2 h_date date;3 begin 4 h_date:=pack_emp.fun_date(7369);第第7 7章章 过程、函数和程序包过程、函数和程序包 5 DBMS_OUTPUT.PUT_LINE(该职员的就职日期是:|h_date);6 end;7 /该职员的就职日期是:17-12月-80PL/SQL 过程已成功完成。第第7 7章章 过程、函数和程序包过程、函数和程序包2编写一个程序包,此程序包有一个过程和一个函数。过程利用传入参数传入员工的工作职位(emp表JOB字段),显示该职位中的员工数量。函数利用传入参数传入员工的工作职位,返回该职位中的员工数量。编写调用程序执行(使用SCOTT用户的emp表)。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 销售管理


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!