1、1第第6章章 PL/SQL编程基础编程基础 在实际情况中,信息的存储和查询只是数据库系统应用中的一部分,即便最简单的数据处理程序也不可能只使用SQL语句来完成。例如,在某公司的工资管理系统中,需要根据每位员工职位和工作表现附加一定的补住。因此,在实际的应用中,仅仅使用SQL语句是远远不够的,这就是为什么Oracle数据库提供了自己的编程语言PL/SQL。2本章知识要点:本章知识要点:PL/SQL和SQL的区别 PL/SQL程序的结构 在PL/SQL程序中应用各种变量 在PL/SQL程序中使用条件语句 在PL/SQL程序中使用循环语句 游标的使用 PL/SQL程序的异常处理36.1 PL/SQL
2、概述概述 PL/SQL是过程化的结构查询语言(Procedural Language/Structured Query Language),它可以弥补SQL语句的不足。在PL/SQL中可以通过IF和LOOP语句控制程序的执行流程,并且可以定义变量,以便利用这些变量在语句之间传递数据信息。PL/SQL是Oracle的专用语言,它是对标准SQL语言的扩展,并且SQL语句可以嵌套在PL/SQL程序代码中,将SQL的数据处理能力和PL/SQL的过程处理能力结合在一起。46.2 变量与数据类型变量与数据类型 变量本质上是一种用名称进行标记的容器,它们可以包含或保存不同类型的数据。根据不同的数据类型,变量
3、可以存储不同类型的数据,并且彼此可以通过变量名进行区分。56.2.1 PL/SQL变量的声明变量的声明可以使用下面两种语法声明PL/SQL变量:variable_name data_type NOT NULL:=default_value_expression;variable_name data_type NOT NULL DEFAULT default_value_expression;66.2.2%TYPE变量变量 在声明变量时,除了可以使用Oracle规定的数据类型外,还可以使用%TYPE关键字定义变量类型。%TYPE关键字的含义是声明一个与指定列名称相同的数据类型。例如,下面的语句声
4、明了一个与EMP表中ENAME列完全相同的数据类型:declarevar_name emp.ename%type;76.2.3 复合变量复合变量 很多结构化程序设计语言都提供了记录类型的数据类型,在PL/SQL中,也支持将多个基本数据类型捆绑在一起的记录数据类型,即复合变量。相对于标量变量,复合变量一次可以存储多个数值。86.3 条件语句条件语句 PL/SQL与其他的编程语言一样,也都具有条件判断语句,条件判断语句的主要作用是根据条件的变化选择执行不同的代码。96.3.1 IFTHEN条件语句条件语句 在PL/SQL中为了控制程序的执行方向,引进了IF语句。最简单的IF语句就是IF.THEN语
5、句,其语法形式如下:if then pl/sql_statement;end if;106.3.2 IFTHENELSE条件语句条件语句 IF语句的另一种形式就是与ELSE语句结合使用,形成IF.THEN.ELSE语句。该语句的语法形式如下:if then pl/sql_statement1;else pl/sql_statement2;end if;116.3.3 IFTHENELSIF条件语句条件语句 IFTHENELSIF语句实现了IF语句的嵌套,从而实现了判定两个以上的判断条件。该语句的语法形式如下:if then pl/sql_statement1;elsif then pl/sql
6、_statement2;else pl/sql_statement3;end if;126.3.4 CASE条件语句条件语句 从Oracle9i后,在PL/SQL中也可以像其他的编程语言一样使用CASE语句,CASE语句的执行方式与IF语句相似。通常情况下,CASE语句从关键字CASE开始,后面跟着一个选择器,它通常是一个变量。接下来是WHEN子句,它将根据选择器的值执行不同的PL/SQL语句。136.4 循环语句循环语句 循环语句可以控制程序多次重复地执行某一组语句。在PL/SQL中,常用的循环语句有3种类型,即LOOP循环、WHILE循环和FOR循环。在这几种基本循环的基础上又可以演变出许
7、多嵌套循环控制。146.4.1 LOOPEND LOOP循环循环 LOOP循环也是最基本的循环,也称为无条件的循环。在这种类型的循环中如果没有指定EXIT语句,循环将一直运行,即出现死循环。死循环是应该尽量避免的。因此,在LOOP循环中必须指定EXIT语句,以便循环停止执行。LOOP循环的语法格式如下:loop statements;exit when conditionend loop;156.4.2 WHILE循环循环 另一种循环类型是WHILE循环,它适用于事先无法知道控制循环终止变量值的情况。与LOOP循环的不同之外在于WHILE循环在循环的顶部包括了判断条件,这样在每次执行循环时,都
8、将判断该条件。如果判断条件为TRUE,那么循环将继续执行。如果判断条件为FALSE,那么循环将会停止执行。WHILE循环的语法结构如下:while conditionloop statements;end loop;166.4.3 FOR循环循环 在上面的WHILE循环中,为了防止出现死循环,需要在循环内不断修改判断条件。而FOR循环则使用一个循环记数器,并通过它来控制循环执行的次数。该计数器可以从小到大进行记录,也可以相反,从大到小进行记录。如果不满足循环条件,则终止循环。FOR循环的语法结构如下:for loop_variable_name in reverse lower_boundup
9、per_bound loop statements;end loop176.5 游标的使用游标的使用 游标的作用就相当于指针,通过游标程序设计语言就可以一次处理查询结果集中的一行。在Oracle中,游标可以分为两大类:静态游标和REF游标。REF游标是一种引用类型,类似于指针。而静态游标又可以分为显式游标和隐式游标。186.5.1 隐式游标隐式游标 在执行一个SQL语句时,Oracle会自动创建一个隐式游标。这个游标是内存中处理该语句的工作区域,在其中存储了执行SQL语句的结果。通过游标的属性可获知SQL语句的执行结果,以及游标的状态信息。196.5.2 显式游标显式游标 在PL/SQL程序中
10、处理结果集时,用户也可以通过显式定义游标,然后手动操作该游标处理结果集。使用显式游标处理数据需要的四个步骤:定义游标、打开游标、提取游标数据和关闭游标。206.5.3 游标游标FOR循环循环 从上面的示例中可以发现,游标通常是与循环联合使用。实际上,PL/SQL还提供了一种将两者综合在一起的语句,即游标FOR循环语句。游标FOR循环是显式游标的一种快捷使用方式,它使用FOR循环依次读取结果集中的数据。当FOR循环开始时,游标会自动打开(不需要使用OPEN方法),每循环一次系统自动读取游标当前行的数据(不需要使用FETCH),当退出FOR循环时,游标被自动关闭(不需要使用CLOSE)。216.6
11、 异常处理异常处理 在编写PL/SQL程序时,不可避免地会出现一些错误。在Oracle系统中使用异常来处理这些错误,这些异常都可以包括在PL/SQL程序的EXCEPTION块中。Oracle系统提供了许多内置的异常,用户也可以根据自己的需要定义异常。226.6.1 预定义的异常处理预定义的异常处理 当PL/SQL程序违反了Oracle的规定或超出了系统规定的限制时,就会隐含地引发一个预定义异常错误。如前面已经提到过的异常ZERO_DIVIDE就是系统预定义的,Oracle PL/SQL自身能发现和引发的异常较少。236.6.2 非预定义异常非预定义异常 在一个异常产生、被捕获并处理之前,它必须被定义。Oracle定义了几千个异常,绝大多数只有错误编号和相关描述,仅仅命名了21个最常被用到的异常,即系统预定义异常。这些异常的名称被储存在STANDARD,UTL_FILE,DBMS_SQL这几个系统包中。246.6.3 用户定义的异常用户定义的异常 系统预定义异常和非预定义异常都是由Oracle判断的错误,在实际的应用中,程序开发人员可以根据具体的业务逻辑规则,自定义一个异常。这样,当用户操作违反了业备逻辑规则后,就引发一个自定义异常,从而中断程序的正常执行,并转到自定义的异常处理部分。