1、,主讲 韩顺平,玩转oracle 10g实战教程,主讲:韩顺平,email:,主讲 韩顺平,玩转oracle 10g实战教程,oracle第6讲,1. pl/sql的进阶 2. oracle的视图,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶控制结构, 介绍 在任何计算机语言(c,java,c#,c+)都有各种控制语句(条件语句,循环结构,顺序控制结构)在pl/sql中也存在这样的控制结构.在本部分学习完毕后,希望大家达到 : 1) 使用各种if语句 2)使用循环语句 3)使用控制语句-goto 和 null;,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进
2、阶控制结构, 条件分支语句 pl/sql中提供了三种条件分支语句 if - then, if -then-else, if-then-elsif-else 这里我们可以和java语句进行一个比较 简单的条件判断 if then?编写一个过程,可以输入一个雇员名,如果该雇员的工资低于 2000,就给该雇员工资增加10%,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶控制结构, 二重条件分支 ifthen-else ?编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0就在原来的基础上增加100;如果补助为0就把补助设为200; 多重条件分支 if-then-elsif-el
3、se ?编写一个过程,可以输入一个雇员编号,如果该雇员的职位是 PRESIDENT 就给他的工资增加1000,如果该雇员的职位是MANAGER 就给他的工资增加500,其它职位的雇员工资增加200.,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶控制结构, 循环语句 -loop 是pl/sql中最简单的循环语句,这种循环语句以loop开头,以end loop 结尾,这种循环至少会被执行一次. 案例:现有一张表users,表结构如下请,编写一个过程,可输入用户名,并循环添加10个用户到users表中,用户编号从1开始增加.,主讲 韩顺平,玩转oracle 10g实战教程,pl/
4、sql进阶控制结构, 循环语句 while循环 基本循环至少要执行循环体一次,而对于while循环来说,只有条件为true时,才会执行循环体语句,while循环以whileloop 开始,以end loop结束 案例:现有一张表users,表结构如下请,编写一个过程,可输入用户名,并循环添加10个用户到users表中,用户编号从11开始增加.,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶控制结构, 循环语句 for循环 基本for循环的基本结构如下 beginfor i in reverse 110 loopinsert into users values(i,顺平);en
5、d loop; end; / 我们可以看到控制变量i,在隐含中就在不停的增加,推荐使用loop 循环结构,不推荐使用for循环,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶控制结构, 顺序控制语句-goto ,null goto语句 goto语句用于跳转到特定标号去执行语句.注意由于使用goto语句会增加程序的复杂性,并使得应用程序可以读性变差,所以在做一般应用开发时,建议大家不要使用goto语句.基本语法如下 goto lable,其中lable是已经定义好的标号名, declare i int :=1; begin loopdbms_output.put_line(输出
6、i=|i);if i=10 thengoto end_loop;end if;i:=i+1;end loop; dbms_output.put_line(循环结束); end;,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶控制结构, 顺序控制语句-goto ,null null null 语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用null语句的主要好处是可以提高pl/sql的可读性。,举一个简单的案例,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶编写分页过程, 介绍 分页是任何一个网站(bbs、网上商城、blog)都会使用到的技术,因此
7、学习pl/sql编程开发就一定要掌握该技术.,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶编写分页过程, 无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解。首先是掌握最简单的存储过程,无返回值的存储过程: 案例:现有一张表 book ,表结构如下:请编写一个过程,可以向book表添加书,要求通过java程序调用该过程.,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶编写分页过程, 有返回值的存储过程(非列表) 再看如何处理有返回值的存储过程: 案例:编写一个过程,可以输入雇员的编号,返回
8、该雇员的姓名。案例扩展:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资、和岗位。,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶编写分页过程, 有返回值的存储过程(列表结果集) 案例:编写一个过程,输入部门号,返回该部门所有雇员信息。 对该题分析如下: 由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了,步骤如下: 建一个包。 建立存储过程。 下面看看如何在java程序中调用,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶编写分页过程, 编写分
9、页过程 有了上面的基础,相信大家可以完成分页存储过程了。 要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页,排序字段(dept降序)。返回总记录数,总页数,和返回的结果集.如果大家忘了oracle中如何分页,请参考第三天的内容. 先自己完成,老师在后面给出答案,并讲解.,温馨提示,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶例外处理, 例外的基本概念 在PL/SQL 的执行过程中发生异常时系统所作的处理称为一个例外情况(exception)。通常例外情况的种类有三种: 预定义的ORACLE 例外情况ORACLE 预定义的例外情况大约有24 个,对于这种
10、例外情况无须在程序中定义,由ORACLE 自动地触发。(重点) 非预定义的ORACLE 例外情况由使用者增加定义例外情况,然后ORACLE 自动将其触发执行。 自定义例外,这个用的较少。,Exception When 异常情况名 异常处理代码 When 异常情况名 异常处理代码 异常处理代码,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶例外处理, 例外传递 如果不处理例外我们看看会出现什么情况: 案例,编写一个过程,可接收雇员的编号,并显示该雇员的姓名.问题是,如果输入的雇员编号不存在,怎样去处理呢?,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶例外处理
11、, 常用的预定义例外ORACLE 预定之例外情况的处理,下列出常见几个例外情况名 错误代码 描述 NO_DATA_FOUND ORA-01403 对于SELECT 叙述没有传回任何值。 TOO_MANY_ROWS ORA-01427 只允许传回一笔记录的SELECT 叙述结果却多于一笔。 INVALID_CURSOR ORA-01001 使用非法的的光标操作。 VALUE_ERROR ORA-06502 出现数值、数据形态转换、撷取字符串或强制性的错误。 INVALID_NUMBER ORA-01722 字符串到数值的转换失败。 ZERO_DIVIDE ORA-01476 被零除。 DUP_V
12、AL_ON_INDEX ORA-00001 试图向具有唯一键值的索引中插入一个重复键值。 CASE_NOT_FOUND ORA-xxxxx 没有case条件匹配 CURSOR_NOT_OPEN ORA-xxxxxx 游标没有打开,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶例外处理, 预定义例外 case_not_found 在开发pl/sql块中编写case语句时,如果在when子句中没有包含必须的条件分支,就会触发case_not_found的例外 预定义例外 zero_divide 当执行 2/0 语句时,则会触发该例外。 预定义例外 no_data_found 下面
13、是一个pl/sql块,当执行select into 没有返回行,就会触发该例外 预定义例外 too_many_rows 当执行select into 语句时,如果返回超过了一行,则会触发该例外。,对上面的每个例外,我们都给大家举一个案例说明:,主讲 韩顺平,玩转oracle 10g实战教程,pl/sql进阶例外处理, 如何处理多个的例外 set serveroutput on; declare var_name varchar(60); begin select ename into var_name from emp where deptno=10; exception when no_da
14、ta_found then dbms_output.put_line( 没有匹配数据!); when too_many_rows then dbms_output.put_line(返回多行数据!); when others then dbms_output.put_line(提示 错误不明!); end;,主讲 韩顺平,玩转oracle 10g实战教程,oracle视图, 介绍 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。图示,主讲
15、 韩顺平,玩转oracle 10g实战教程,oracle视图, 视图与表的区别表需要占用磁盘空间,视图不需要 视图不能添加索引 使用视图可以简化 复杂查询 比如:学生选课系统 视图用利于提高安全性 比如:不同用户查看不同视图,举例说明,主讲 韩顺平,玩转oracle 10g实战教程,oracle视图, 创建视图 create view 视图名 as select语句 with read only 创建或修改视图 create or replace view 视图名 as select语句 with read only 删除视图 drop view 视图名,当表结构过于复杂,请使用视图吧!,视图,