Oracle数据库应用教程之过程、函数和程序包8532.pptx
《Oracle数据库应用教程之过程、函数和程序包8532.pptx》由会员分享,可在线阅读,更多相关《Oracle数据库应用教程之过程、函数和程序包8532.pptx(79页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7 7章章 过程、函数和程序包过程、函数和程序包第第7章章 过程、函数和程序包过程、函数和程序包 7.1 子程序子程序 7.2 程序包程序包 7.3 小结小结 习题七习题七 上机实验七上机实验七 第第7 7章章 过程、函数和程序包过程、函数和程序包7.1 7.1 子子 程程 序序 以前我们写的PL/SQL语句程序都是瞬时的,都没有命名。其缺点是:在每次执行的时候都要被编译,并且不能被存储在数据库中,其他PL/SQL块也无法调用它们。现在我们把命名的PL/SQL块叫做子程序,它们存储在数据库中,可以为它们指定参数,可以在数据库客户端和应用程序中调用。命名的PL/SQL程序包括存储过程和函数。
2、程序包是存储过程和函数的集合。子程序结构与PL/SQL匿名块的相同点在于都由声明、执行、异常三大部分构成,不同之处在于,PL/SQL匿名块的声明可选,而子程序的声明则是必需的。第第7 7章章 过程、函数和程序包过程、函数和程序包子程序的优点如下:(1)模块化:通过子程序可以将程序分解为可管理的、明确的逻辑模块。(2)可重用性:子程序在创建并执行后,就可以在任何应用程序中使用。(3)可维护性:子程序可以简化维护操作。(4)安全性:用户可以设置权限,保护子程序中的数据,只能让用户提供的过程和函数访问数据。这不仅可以让数据更加安全,同时可保证正确性。子程序有两种类型:过程和函数。其中,过程用于执行某
3、项操作;函数用于执行某项操作并返回值。第第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_handlersEndprocedure_name;第第7 7章章 过程、函数和程序包过程、函数和程序包保留字Is前面的过程定义称为过程头。过程头包括过
4、程名和具有数据类型的参数列表。过程体包括声明部分、执行部分和异常处理部分。过程体从保留字Is之后开始。其中,声明部分和异常处理部分是可选的;执行部分至少包含一条语句。这里的Is|as就相当于declare声明部分,除了拥有前面的一个过程声明语句外,其他和以前的匿名PL/SQL块一样。其中,replace表示在创建存储过程中,如果已经存在同名的存储过程,则重新创建;如果没有此关键词,则当数据库中有同名的过程时会报错“ORA-00955号错误:名称已被现有对象占用”。必须将同名的过程删除后才能创建。第第7 7章章 过程、函数和程序包过程、函数和程序包1)创建不带参数的过程。创建不带参数的过程。【例
5、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 loop9ifi=jthen第第7 7章章 过程、函数和程序包过程、函数和程序包 10 dbms_output.put(to_char(j)|*|11 to_char(i)|=|to_char(i*j)
6、|);12 end if;13 end loop;14 dbms_output.put_line();15 end loop;16 end;17 /过程已创建。出现编译错误的时候可以用showerror或者descuser_errors来调试。第第7 7章章 过程、函数和程序包过程、函数和程序包2)执行过程执行过程创建过程的时候并不会执行过程,必须在这之后调用过程来执行。执行过程的方法有两种:一种是在SQL提示符下,使用execute语句来执行过程;另一种是在匿名块中调用。execute执行过程的语法如下:executeprocedure_name(parameters_list);第第7 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=
8、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创建带参数的
9、过程创建带参数的过程调用程序通过参数可向被调用子程序传递值。在上述语法parameter list 中,参数的具体形式如下:参数1,方式1数据类型1,参数2,方式2数据类型2,参数方式有以下三种:(1)IN表示接受值为默认值。(2)OUT表示将值返回给子程序的调用程序。(3)INOUT表示接受值并返回已更新的值。第第7 7章章 过程、函数和程序包过程、函数和程序包参数的书写格式为:(参数1IN|OUT|INOUT参数类型,参数2IN|OUT|INOUT参数类型,)。参数IN模式是默认模式。如果未指定参数的模式,则认为该参数是IN参数。对于OUT和INOUT参数,必须明确指定,并且这两种类型的参
10、数在返回到调用环境之前必须先赋值。IN参数可以在调用时赋默认值,而OUT参数和INOUT参数不可以。第第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
11、 where empno=sFindNo;8dbms_output.put_line(IDis|sFindNo|dezhigongnameis|第第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.pu
12、t_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】创建一个过程,以雇员号查询雇员的薪
13、水。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;6dbms_output.put_line(Thesalaryof|sFindNo|is:|v_sal);第第7 7章章 过程、函数和程序包过程、函数和程序包 7 exception 8 when no_data_found then 9 dbms_output.put_line
14、(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 que
15、ryEmpSal(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
16、模式参数的过程模式参数的过程【例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_OUTPU
17、T.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 sw
18、ap 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 函数函数函数与过程相似,也是数据库中存储
19、的已命名PL/SQL程序块。与过程不同的是,函数除了完成一定的功能外,还必须返回一个值。1创建函数创建函数创建函数是指通过RETURN子句指定函数返回值的数据类型。在函数体的任何地方,用户都可以通过RETURNexpression语句从函数返回。第第7 7章章 过程、函数和程序包过程、函数和程序包定义函数的语法如下:CREATE OR REPLACE FUNCTION.parameters listRETURN IS|ASlocal_declarations;Beginexecutable statementsexception Exception_handlersEnd;其中,FUNCTIO
20、N为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
21、 many data);12 when others then 13 dbms_output.put_line(error);14 end;15 /函数已创建。第第7 7章章 过程、函数和程序包过程、函数和程序包2执行函数及授权执行函数及授权1)在匿名块中调用在匿名块中调用函数调用与过程调用很相似,在匿名过程中通过函数名(或参数)可以调用一个函数。因为过程没有显式的RETURN语句,所以过程调用可以是一条单独的语句,写在单独的行中。而函数则必须有一个返回值,所以函数调用要借助于可执行语句来完成,例如赋值语句、选择语句和输出语句。下面的例子通过匿名过程调用getname函数,将雇员号作为参数,此
22、函数将雇员姓名传给调用块,然后显示雇员姓名。第第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”的雇员姓名
23、。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 -7369SMITHCLERK790217-12月-8080020第第7 7章章 过程、函数和程序包过程、函数和程序包3函数的授权函数的授权与过程一样,只有创建函数的用户和管理员才有权使用函数,其他
24、用户如果要调用函数,则需要得到该函数的EXECUTE权限。【例7.15】将getname函数的执行权限授予John用户。SQLGRANTEXECUTEONgetnameTOJohn;第第7 7章章 过程、函数和程序包过程、函数和程序包4删除函数删除函数删除函数的命令的一般格式如下:DROP FUNCTION.;【例7.16】删除函数 getname。SQLDROPFUNCTIONgetname;第第7 7章章 过程、函数和程序包过程、函数和程序包7.1.3 过程和函数的比较过程和函数的比较 表7-1过程和函数的比较第第7 7章章 过程、函数和程序包过程、函数和程序包7.2 程程 序序 包包7.
25、2.1 7.2.1 程序包概述程序包概述程序包是数据库中的一个实体,包含一系列公共常量、变量、数据类型、游标、过程及函数的定义。使用包更加体现了模块化编程的优点,使得开发工作能灵活自如地进行。程序包包括两个部分:程序包规范说明部分和程序包主体部分。第第7 7章章 过程、函数和程序包过程、函数和程序包1程序包规范说明部分程序包规范说明部分该部分相当于一个包的头,类似于接口,可以对包的部件作简单说明。其中的过程、函数、变量、常量和游标都是公共的,可在应用程序中访问。(1)使用create package进行创建。(2)包含公用对象和类型。(3)声明类型、变量、常量、异常、游标和子程序。(4)可以在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 数据库 应用 教程 过程 函数 程序包 8532
限制150内