1、第第1919章章 PL/SQLPL/SQL中的控制结构中的控制结构同其他的高级语言(例如,同其他的高级语言(例如,C、Java等)一样,等)一样,PL/SQL也可以使用各种控制结构对也可以使用各种控制结构对PL/SQL的语句块进行控的语句块进行控制。制。PL/SQL中的控制结构包括分支结构、循环结构和顺序中的控制结构包括分支结构、循环结构和顺序结构。本章就来介绍结构。本章就来介绍PL/SQL中的这几种控制结构的使用方中的这几种控制结构的使用方法。法。分支控制结构;分支控制结构;循环控制结构;循环控制结构;顺序控制结构。顺序控制结构。.19.1 19.1 分支控制分支控制分支控制语句是通过判断条
2、件表达式是分支控制语句是通过判断条件表达式是TRUE或者或者FALSE来决定程序的执行。来决定程序的执行。PL/SQL中分支控制语句包括中分支控制语句包括IF语句和多分支的选择的语句和多分支的选择的CASE语句。语句。IF语句有可以分为简单语句有可以分为简单条件语句条件语句IF-THEN、二重条件分支语句、二重条件分支语句IF-THEN-ELSE和和多重条件分支语句多重条件分支语句IF-THEN-ELSEIF。这一节就来介绍。这一节就来介绍PL/SQL中的中的IF语句的用法。多分支的选择的语句的用法。多分支的选择的CASE语句将语句将在在19.2节中介绍。节中介绍。.19.1.1 IF-THE
3、N19.1.1 IF-THEN简单条件语句简单条件语句简单条件语句简单条件语句IF-THEN主要是用来对某一个单一条件主要是用来对某一个单一条件进行判断。在使用进行判断。在使用IF-THEN简单条件语句时,如果满足简单条件语句时,如果满足IF中中的指定条件,则会执行的指定条件,则会执行THEN语句后面的操作;如果不满足语句后面的操作;如果不满足IF中的指定条件,则会退出分支条件语句。简单条件语句中的指定条件,则会退出分支条件语句。简单条件语句IF-THEN的语法规则如下:的语法规则如下:IF expression THENstatement;END IF;在这个在这个IF-THEN的条件语句中
4、,的条件语句中,expression是逻辑表达是逻辑表达式或者关系表达式。如果式或者关系表达式。如果expression的值为的值为TRUE就会执行就会执行THEN后面的后面的statement语句,否则的话,就会退出语句,否则的话,就会退出IF-THEN分支条件语句。关键字分支条件语句。关键字END IF是是IF语句结束的标志。语句结束的标志。.19.1.1 IF-THEN19.1.1 IF-THEN简单条件语句简单条件语句下面来看一个使用下面来看一个使用IF-THEN简单条件语句的例子。现在简单条件语句的例子。现在要查询教师信息表中教师编号为要查询教师信息表中教师编号为t156354的工资
5、,如果该名的工资,如果该名教师的工资小于教师的工资小于3000,那么就将该名教师的工资在原有的,那么就将该名教师的工资在原有的基础上加上基础上加上300;如果工资大于;如果工资大于3000,就将该名教师的工资,就将该名教师的工资在原有的基础上加上在原有的基础上加上100。.19.1.1 IF-THEN19.1.1 IF-THEN简单条件语句简单条件语句DECLAREv_salary NUMBER(6,2);-教师工资教师工资v_ teaID VARCHAR2(15):=t156354;BEGIN/*查询指定教师编号的教师工资查询指定教师编号的教师工资*/SELECT salary INTO v
6、_salaryFROM t_teacherWHERE teaID=v_ teaID;/*判断教师工资,如果小于判断教师工资,如果小于3000则执行更新操作则执行更新操作*/IF v_salary 3000 THENUPDATE t_teacher SET salary=v_salary+100-修改教师工资修改教师工资WHERE teaID=v_ teaID;END IF;END;.19.1.2 IF-THEN-ELSE19.1.2 IF-THEN-ELSE条件分支语句条件分支语句IF-THEN-ELSE条件分支语句可以根据条件判断来选条件分支语句可以根据条件判断来选择不同的操作。在使用择不同
7、的操作。在使用IF-THEN-ELSE条件分支语句时,如条件分支语句时,如果满足果满足IF中的指定条件,则会执行中的指定条件,则会执行THEN语句后面的操作;语句后面的操作;如果不满足如果不满足IF中的指定条件,则会执行中的指定条件,则会执行ELSE后面的操作。后面的操作。其语法规则如下:其语法规则如下:IF expression THENstatement1;ELSE statement2;END IF;.19.1.2 IF-THEN-ELSE19.1.2 IF-THEN-ELSE条件分支语句条件分支语句DECLARETYPE char_table_type IS TABLE OF VARC
8、HAR2(1)char_tab1 char_table_type;-没有初始化嵌套表没有初始化嵌套表char_tab2 char_table_type:=char_table_type();-初始化嵌套表初始化嵌套表char_tab3 char_table_type:=char_table_type(a,b,c);-初始化嵌套表初始化嵌套表BEGIN/*判断嵌套表判断嵌套表char_tab1是否为是否为NULL*/IF char_tab1 IS NULL THEN DBMS_OUTPUT.PUT_LINE(char_tab1为为NULL);-显示嵌套表为显示嵌套表为NULL信息信息 ELSED
9、BMS_OUTPUT.PUT_LINE(char_tab1不为不为NULL);-显示嵌套表不为显示嵌套表不为NULL信息信息 End IF;/*判断嵌套表判断嵌套表char_tab2是否为是否为NULL*/IF char_tab2 IS NULL THEN DBMS_OUTPUT.PUT_LINE(char_tab2为为NULL);-显示嵌套表为显示嵌套表为NULL信息信息 ELSEDBMS_OUTPUT.PUT_LINE(char_tab2不为不为NULL);-显示嵌套表不为显示嵌套表不为NULL信息信息 End IF;/*判断嵌套表判断嵌套表char_tab3是否为是否为NULL*/IF
10、char_tab3 IS NULL THEN DBMS_OUTPUT.PUT_LINE(char_tab3为为NULL);-显示嵌套表为显示嵌套表为NULL信息信息 ELSEDBMS_OUTPUT.PUT_LINE(char_tab3不为不为NULL);-显示嵌套表不为显示嵌套表不为NULL信息信息 End IF;END;.19.1.3 IF-THEN-ELSEIF19.1.3 IF-THEN-ELSEIF多重条件分支语句多重条件分支语句IF-THEN-ELSEIF多重条件分支语句主要是用于复杂多重条件分支语句主要是用于复杂条件的分支操作。在条件的分支操作。在IF-THEN-ELSEIF多重条
11、件分支语句时多重条件分支语句时,如果满足第一个,如果满足第一个IF中的指定条件,则会执行其对应的中的指定条件,则会执行其对应的THEN语句后面的操作;如果不满足第一个语句后面的操作;如果不满足第一个IF中的指定条件中的指定条件,则会判断第一个,则会判断第一个ELSEIF后面的条件,如果满足其条件,后面的条件,如果满足其条件,就会执行其对应的就会执行其对应的THEN语句后面的操作,如果不满足其条语句后面的操作,如果不满足其条件,就会检查第二个件,就会检查第二个ELSEIF后面的条件(如果有的话),后面的条件(如果有的话),以此类推,直到遇到以此类推,直到遇到END IF结束整个条件分支语句的判断
12、结束整个条件分支语句的判断。IF-THEN-ELSEIF多重条件分支语句的语法规则如下:多重条件分支语句的语法规则如下:.19.1.3 IF-THEN-ELSEIF19.1.3 IF-THEN-ELSEIF多重条件分支语句多重条件分支语句IF expression1 THENstatement1;ELSEIF expression2 THENstatement2;ELSEstatement3;END IF;在这个在这个IF-THEN-ELSEIF多重条件分支语句中,如果多重条件分支语句中,如果expression1的值为的值为TRUE,就会执行,就会执行statement1语句;如果语句;如果
13、expression1的值为的值为FALSE,就判断,就判断ELSEIF后面的表达式后面的表达式expression2,如果,如果expression2的值为的值为TRUE,则会执行,则会执行statement2语句;如果语句;如果expression2的值为的值为FALSE,则会执行,则会执行ELSE后面的后面的statement3语句。关键字语句。关键字END IF是是IF语句结束的标志。语句结束的标志。.19.1.3 IF-THEN-ELSEIF19.1.3 IF-THEN-ELSEIF多重条件分支语句多重条件分支语句现在需要在屏幕上输入一个指定教师的编号,并以该现在需要在屏幕上输入一个
14、指定教师的编号,并以该教师的教师编号作为限制条件查询教师所在的院系,根据该教师的教师编号作为限制条件查询教师所在的院系,根据该名教师所在的院系对其工资进行调整。如果教师所在的院系名教师所在的院系对其工资进行调整。如果教师所在的院系是计算机系,就将该名教师的工资在原有的基础上加上是计算机系,就将该名教师的工资在原有的基础上加上300;如果教师所在的院系是数学系,就将该名教师的工资在原;如果教师所在的院系是数学系,就将该名教师的工资在原有的基础上加上有的基础上加上200,如果教师所在的院系是物理系,就将,如果教师所在的院系是物理系,就将该名教师的工资在原有的基础上加上该名教师的工资在原有的基础上加
15、上100。.19.1.3 IF-THEN-ELSEIF19.1.3 IF-THEN-ELSEIF多重条件分支语句多重条件分支语句DECLAREv_salary NUMBER(6,2);-定义表示教师工资的变量定义表示教师工资的变量v_ deptID VARCHAR2(15);-定义表示教师所在院系的变量定义表示教师所在院系的变量BEGIN/*根据输入的教师编号查询教师工资和所在院系根据输入的教师编号查询教师工资和所在院系SELECT salary,deptID INTO v_salary,v_ deptIDFROM t_teacherWHERE teaID=&teaID;/*如果是计算机系,则
16、将教师工资加上如果是计算机系,则将教师工资加上300*/IF v_ deptID=10 THEN UPDATE t_teacher SET salary=v_salary+300-修改教师工资修改教师工资WHERE teaID=&teaID;/*如果是数学系,则将教师工资加上如果是数学系,则将教师工资加上200*/ELSEIF v_ deptID=15 THENUPDATE t_teacher SET salary=v_salary+200-修改教师工资修改教师工资WHERE teaID=&teaID;/*如果是物理系,则将教师工资加上如果是物理系,则将教师工资加上100*/ELSE v_ d
17、eptID=18 THENUPDATE t_teacher SET salary=v_salary+100-修改教师工资修改教师工资WHERE teaID=&teaID;END IF;END;.19.1.4 19.1.4 嵌套的嵌套的IFIF语句语句同其他的高级语言(例如,同其他的高级语言(例如,C、Java等)一样,等)一样,PL/SQL中的中的IF语句也可以嵌套使用。以语句也可以嵌套使用。以IF-THEN-ELSE条件分支语句为例,条件分支语句为例,其嵌套的语法规则如下:其嵌套的语法规则如下:IF expression1 THEN statement1;ELSE IF expression
18、2 THEN statement2;ELSE IF expression3 THEN statement3;END IF;END IF;END IF;.19.1.4 19.1.4 嵌套的嵌套的IFIF语句语句这里嵌套了三层这里嵌套了三层IF-THEN-ELSE语句。该语句首先会语句。该语句首先会对对expression1的值进行判断,如果的值进行判断,如果expression1的值为的值为TRUE,则执行,则执行statement1;如果;如果expression1的值为的值为FALSE,则判,则判断断expression2的值;如果的值;如果expression2的值为的值为TRUE,则执行
19、,则执行statement2;如果;如果statement2的值为的值为FASLE,则判断,则判断expression3的值;如果的值;如果expression3的值为的值为TRUE,则执行,则执行statement3;否则的话,则结束;否则的话,则结束IF-THEN-ELSE语句,执行语句,执行IF-THEN-ELSE语句后面的语句。语句后面的语句。.19.1.4 19.1.4 嵌套的嵌套的IFIF语句语句DECLAREv_salary NUMBER(6,2);-教师工资教师工资v_ deptID VARCHAR2(15);-教师所在院系教师所在院系BEGIN/*根据输入的教师编号查询教师工
20、资和所在院系根据输入的教师编号查询教师工资和所在院系*/SELECT salary,deptID INTO v_salary,v_ deptIDFROM t_teacherWHERE teaID=&teaID;/*如果是计算机系,则将教师工资加上如果是计算机系,则将教师工资加上300*/IF v_ deptID=10 THEN UPDATE t_teacher SET salary=v_salary+300-修改教师工资修改教师工资WHERE teaID=&teaID;ELSE/*如果是数学系,则将教师工资加上如果是数学系,则将教师工资加上200*/IF v_ deptID=15 THENUP
21、DATE t_teacher SET salary=v_salary+200-修改教师工资修改教师工资WHERE teaID=&teaID;/*如果是物理系,则将教师工资加上如果是物理系,则将教师工资加上100*/ELSE v_ deptID=18 THENUPDATE t_teacher SET salary=v_salary+100-修改教师工资修改教师工资WHERE teaID=&teaID;END IF;END IF;END;.19.2 CASE19.2 CASE语句语句在在Oracle9i之前,多重条件分支语句只能使用之前,多重条件分支语句只能使用IF-THEN-ELSEIF语句来实
22、现,在语句来实现,在Oracle9i及其以后的版本中及其以后的版本中可以使用可以使用CASE语句实现多重条件分支的操作。与语句实现多重条件分支的操作。与IF-THEN-ELSEIF多重条件分支语句相比,多重条件分支语句相比,CASE语句的书写更简洁语句的书写更简洁、可读性更强、执行效率也更高,所以,在实际应用中,应、可读性更强、执行效率也更高,所以,在实际应用中,应该尽量把该尽量把IF-THEN-ELEIF语句改写成语句改写成CASE语句。本节就来语句。本节就来介绍多分支的选择介绍多分支的选择CASE语句的用法。语句的用法。.19.2.1 19.2.1 实现等值比较的实现等值比较的CASECA
23、SE语句语句实现等值比较的实现等值比较的CASE语句是以关键字语句是以关键字CASE开头,关开头,关键字键字CASE后面需要指定一个表达式或者一个用于被检测的后面需要指定一个表达式或者一个用于被检测的变量。变量。CASE语句后面可以有一个或者多个语句后面可以有一个或者多个WHEN子句,根子句,根据给定的表达式或者被检测变量的值决定哪个子句被执行。据给定的表达式或者被检测变量的值决定哪个子句被执行。其语法规则如下:其语法规则如下:.19.2.1 19.2.1 实现等值比较的实现等值比较的CASECASE语句语句CASE selector WHEN value1 THEN sequence_of_
24、statements1;WHEN value2 THEN sequence_of_statements2;.WHEN valueN THEN sequence_of_statementsN;ELSE sequence_of_statementsN+1;END CASE;.19.2.1 19.2.1 实现等值比较的实现等值比较的CASECASE语句语句其中,其中,selector用来指定一个表达式或者一个用于检测用来指定一个表达式或者一个用于检测的变量;的变量;value1、value一直到一直到valueN表示需要比较的值;表示需要比较的值;sequence_of_statements1、se
25、quence_of_statements2一直到一直到sequence_of_statementsN表示针对不同的比较值要执行不同表示针对不同的比较值要执行不同的操作;如果所有的的操作;如果所有的value值都不满足条件,则会执行值都不满足条件,则会执行ELSE后面的后面的sequence_of_statementsN+1的语句。的语句。ELSE子句是可子句是可选的。关键字选的。关键字END CASE用来表示用来表示CASE语句的结束标志。语句的结束标志。.19.2.1 19.2.1 实现等值比较的实现等值比较的CASECASE语句语句DECLAREv_salary NUMBER(6,2);-
26、教师工资教师工资v_ deptID VARCHAR2(15);-教师所在院系教师所在院系BEGIN/*根据输入的教师编号查询教师工资和所在院系根据输入的教师编号查询教师工资和所在院系*/SELECT salary,deptID INTO v_salary,v_ deptIDFROM t_teacherWHERE teaID=&teaID;CASE deptID/*如果是计算机系,则将教师工资加上如果是计算机系,则将教师工资加上300*/WHEN 10 THEN UPDATE t_teacher SET salary=v_salary+300-修改教师工资修改教师工资WHERE teaID=&t
27、eaID;/*如果是数学系,则将教师工资加上如果是数学系,则将教师工资加上200*/WHEN 15 THEN UPDATE t_teacher SET salary=v_salary+200-修改教师工资修改教师工资WHERE teaID=&teaID;/*如果是物理系,则将教师工资加上如果是物理系,则将教师工资加上100*/WHEN 18 THENUPDATE t_teacher SET salary=v_salary+100-修改教师工资修改教师工资WHERE teaID=&teaID;ELSEDBMS_OUTPUT.PUT_LINE(非计算机系、数学系或者物理系的教师非计算机系、数学系或
28、者物理系的教师);END CASE;END;.19.2.2 19.2.2 设定标记的设定标记的CASECASE语句语句同同PL/SQL语句块一样,也可以使用语句块一样,也可以使用“”为为CASE语句添加标记。设定标记的语句添加标记。设定标记的CASE语句的语法规则如下:语句的语法规则如下:CASE selector WHEN value1 THEN sequence_of_statements1;WHEN value2 THEN sequence_of_statements2;.WHEN valueN THEN sequence_of_statementsN;ELSE sequence_of_
29、statementsN+1;END CASE ;.19.2.2 19.2.2 设定标记的设定标记的CASECASE语句语句其中,其中,label_name表示标记的名称,需要使用表示标记的名称,需要使用“”(双尖括号)将其括起来。当为双尖括号)将其括起来。当为CASE语句添加标记时,该语句添加标记时,该标记必须出现在标记必须出现在CASE语句的开头。如果为语句的开头。如果为CASE语句添加语句添加了标记,那么该标记名称也可以出现在了标记,那么该标记名称也可以出现在CASE语句的结尾处语句的结尾处,但它是可选的。如果在,但它是可选的。如果在END CASE处使用标记名称,那么处使用标记名称,那么
30、该标记名称要和该标记名称要和CASE语句开头设定的标记名称相匹配。语句开头设定的标记名称相匹配。.19.2.3 19.2.3 搜寻式搜寻式CASECASE语句语句在在CASE语句中,也可以不在关键字语句中,也可以不在关键字CASE之后使用之后使用selector用来指定一个表达式或者一个用于检测的变量,把这用来指定一个表达式或者一个用于检测的变量,把这种种CASE语句称为搜索式的语句称为搜索式的CASE语句。其语法规则如下:语句。其语法规则如下:CASE WHEN exception1 THEN sequence_of_statements1;WHEN exception12THEN sequ
31、ence_of_statements2;.WHEN exceptionN THEN sequence_of_statementsN;ELSE sequence_of_statementsN+1;END CASE;.19.2.3 19.2.3 搜寻式搜寻式CASECASE语句语句在搜寻式的在搜寻式的CASE语句中,语句中,exception1、exception2一直一直到到exceptionN表示布尔类型的表达式;表示布尔类型的表达式;sequence_of_statements1、sequence_of_statements2一直到一直到sequence_of_statementsN表示满足
32、表达式的值时要执行不同表示满足表达式的值时要执行不同的操作。的操作。.19.2.3 19.2.3 搜寻式搜寻式CASECASE语句语句DECLAREv_salary NUMBER(6,2);-教师工资教师工资v_ age VARCHAR2(15);-教师年龄教师年龄BEGIN/*根据输入的教师编号查询教师工资和所在院系根据输入的教师编号查询教师工资和所在院系*/SELECT salary,age INTO v_salary,v_ageFROM t_teacherWHERE teaID=&teaID;CASE/*如果教师的年龄小于如果教师的年龄小于30,则将教师工资加上,则将教师工资加上500*
33、/WHEN v_age 30 THEN UPDATE t_teacher SET salary=v_salary+500-修改教师工资修改教师工资WHERE teaID=&teaID;/*如果教师的年龄小于如果教师的年龄小于40,则将教师工资加上,则将教师工资加上300*/WHEN v_age 40THEN UPDATE t_teacher SET salary=v_salary+300-修改教师工资修改教师工资WHERE teaID=&teaID;/*如果教师的年龄小于如果教师的年龄小于50,则将教师工资加上,则将教师工资加上200*/WHEN v_age 50THENUPDATE t_te
34、acher SET salary=v_salary+200-修改教师工资修改教师工资WHERE teaID=&teaID;ELSE/*如果教师的年龄大于如果教师的年龄大于50,则将教师工资加上,则将教师工资加上100*/UPDATE t_teacher SET salary=v_salary+100-修改教师工资修改教师工资WHERE teaID=&teaID;END CASE;END;.19.3 19.3 循环控制循环控制循环控制语句与分支控制语句不同,它可以通过判断循环控制语句与分支控制语句不同,它可以通过判断给定的条件重复执行某一个语句或者是多条语句的代码段。给定的条件重复执行某一个语句
35、或者是多条语句的代码段。PL/SQL中循环控制语句主要包括中循环控制语句主要包括LOOP循环语句、循环语句、WHILE-LOOP循环语句和循环语句和FOR-LOOP循环语句。本节就来介绍这循环语句。本节就来介绍这三种循环语句的使用方法。三种循环语句的使用方法。.19.3.1 LOOP19.3.1 LOOP循环语句循环语句 LOOP循环是循环是PL/SQL中简单的循环语句。在中简单的循环语句。在LOOP循循环中,执行循环的语句被放到关键字环中,执行循环的语句被放到关键字LOOP和和END LOOP之之间,其语法规则如下:间,其语法规则如下:LOOP statement;EXIT WHEN con
36、ditionEND LOOP;.19.3.1 LOOP19.3.1 LOOP循环语句循环语句其中,其中,statement是要执行的循环语句,这样的循环语是要执行的循环语句,这样的循环语句可以有一条,也可以有多条。在句可以有一条,也可以有多条。在LOOP循环语句中,如果循环语句中,如果有多条有多条statement语句,则这些语句会被顺序的执行;语句,则这些语句会被顺序的执行;EXIT语句用来终止语句用来终止LOOP循环。当程序遇到循环。当程序遇到EXIT语句时,循环语句时,循环就会立即停止,程序会跳出循环体,转而执行就会立即停止,程序会跳出循环体,转而执行LOOP循环后循环后面的语句。在面的
37、语句。在EXIT关键字之后,还有一个关键字之后,还有一个WHEN子句,可子句,可以根据以根据condition的条件跳出循环,当的条件跳出循环,当condition的值为的值为TRUE时,就会终止时,就会终止LOOP循环,转而执行循环后面的语句。这个循环,转而执行循环后面的语句。这个WHEN子句是可选的。子句是可选的。.19.3.1 LOOP19.3.1 LOOP循环语句循环语句DECLAREv_count INT:=1;-定义表示计数器的变量定义表示计数器的变量v_sum INT:=0;-定义表示定义表示1到到10加和的变量加和的变量BEGINLOOPv_sum=v_ sum+1;-计算计算
38、1到到10的加和的加和EXIT WHEN v_count=10;-终止循环的条件终止循环的条件v_count:=v_count+1;-计数变量加计数变量加1END LOOP;DBMS_OUTPUT.PUT_LINE(v_sum=|v_sum);END;.19.3.2 WHILE-LOOP19.3.2 WHILE-LOOP循环语句循环语句WHILE-LOOP循环语句是根据循环语句是根据WHILE条件给定的布条件给定的布尔表达式的结果是尔表达式的结果是TRUE还是还是FALSE,来决定是否需要重复,来决定是否需要重复执行循环体中的语句。其语法规则如下:执行循环体中的语句。其语法规则如下:WHILE
39、 condition LOOP statement;END LOOP;.19.3.2 WHILE-LOOP19.3.2 WHILE-LOOP循环语句循环语句其中,其中,condition是指定的布尔表达式;是指定的布尔表达式;WHILE-LOOP循环语句会根据该布尔表达式的值来决定是否需要重复执行循环语句会根据该布尔表达式的值来决定是否需要重复执行循环体中的语句。如果循环体中的语句。如果condition的值为的值为TRUE,则,则WHILE-LOOP循环语句中的循环语句中的statement语句就会被执行;如果语句就会被执行;如果condition的值为的值为FALSE,则会退出,则会退出W
40、HILE-LOOP循环语句循环语句,转而执行,转而执行WHILE-LOOP循环语句后面的语句。循环语句后面的语句。.19.3.2 WHILE-LOOP19.3.2 WHILE-LOOP循环语句循环语句DECLAREv_count INT:=1;-定义表示计数器的变量定义表示计数器的变量v_sum INT:=0;-定义表示定义表示1到到10加和的变量加和的变量BEGINWHILE v_count10 LOOPv_sum=v_ sum+1;-计算计算1到到10的加和的加和v_count:=v_count+1;-计数变量加计数变量加1END LOOP;DBMS_OUTPUT.PUT_LINE(v_s
41、um=|v_sum);END;.19.3.3 FOR-LOOP19.3.3 FOR-LOOP循环语句循环语句在在LOOP循环和循环和WHILE-LOOP循环语句中,循环的次循环语句中,循环的次数是未知的,但是在有些情况下,循环的次数是可以预知的数是未知的,但是在有些情况下,循环的次数是可以预知的,例如。计算,例如。计算1+2+3+10的值,这里很明显是需要循环的值,这里很明显是需要循环10次,像这样可以明确的知道循环次数的问题,就可以使用次,像这样可以明确的知道循环次数的问题,就可以使用FOR-LOOP循环语句来完成。其语法规则如下:循环语句来完成。其语法规则如下:FOR counter IN
42、 REVERSElower_bound.higher_bound LOOP statement;END LOOP;.19.3.3 FOR-LOOP19.3.3 FOR-LOOP循环语句循环语句其中,其中,counter表示的是隐式声明的循环控制变量;表示的是隐式声明的循环控制变量;lower_bound用来指定用来指定counter的下限;的下限;higher_bound用来指用来指定定counter的上限;的上限;statement表示循环体中的语句;在表示循环体中的语句;在lower_bound和和higher_bound之间有之间有“.”(两个两个点点),这两,这两个个点点是作为是作为F
43、OR-LOOP循环语句的范围操作符来使用的循环语句的范围操作符来使用的。.19.3.3 FOR-LOOP19.3.3 FOR-LOOP循环语句循环语句DECLARETYPE char_table_type IS TABLE OF VARCHAR2(1)char_tab char_table_type:=char_table_type(a,b,c,d,e);-初始化嵌套表初始化嵌套表BEGINFOR v_count IN 1.5 LOOPDBMS_OUTPUT.PUT_LINE(char_tab(v_count)|);-显示嵌套表中元素的信息显示嵌套表中元素的信息END LOOP;END;.19
44、.3.4 19.3.4 嵌套循环嵌套循环同其他的高级语言(例如,同其他的高级语言(例如,C、Java等)一样,等)一样,PL/SQL中的循环语句也可以嵌套使用。例如,在中的循环语句也可以嵌套使用。例如,在LOOP嵌嵌套循环语句中,可以使用套循环语句中,可以使用EXIT语句结束任意一个语句结束任意一个LOOP循循环,只有在环,只有在LOOP循环中添加一个标记,然后在循环中添加一个标记,然后在EXIT语句语句使用这个标记就可以退出该标记指定下的使用这个标记就可以退出该标记指定下的LOOP循环。循环。.19.3.4 19.3.4 嵌套循环嵌套循环BEGIN-外层循环标记外层循环标记LOOP .LOO
45、P .EXIT outer WHEN.退出外层循环退出外层循环 END LOOP;.END LOOP outer;END;.19.4 19.4 顺序控制顺序控制在在PL/SQL中,不仅有分支控制语句和循环控制语句,中,不仅有分支控制语句和循环控制语句,还有顺序控制语句。顺序控制语句主要包括还有顺序控制语句。顺序控制语句主要包括GOTO语句和语句和NULL语句。语句。GOTO语句主要是用来简化程序逻辑,语句主要是用来简化程序逻辑,NULL语句主要是用来提高语句主要是用来提高PL/SQL程序的可读性。在程序的可读性。在PL/SQL中顺中顺序控制语句并不是经常用到。这一节就来介绍使用序控制语句并不是
46、经常用到。这一节就来介绍使用GOTO语语句和句和NULL语句的方法。语句的方法。.19.4.1 GOTO19.4.1 GOTO语句语句GOTO语句主要用于跳转到指定的标记处,执行指定语句主要用于跳转到指定的标记处,执行指定标记处的代码。使用标记处的代码。使用GOTO语句跳转到标记处的语法规则如语句跳转到标记处的语法规则如下下GOTO label_name;其中,其中,label_name表示指定的标记。在表示指定的标记。在PL/SQL程序中程序中,标记名称是使用,标记名称是使用“”(双尖括号)括起来的。程序在双尖括号)括起来的。程序在执行的时候,当遇到执行的时候,当遇到GOTO语句时,就会将控
47、制权交给指定语句时,就会将控制权交给指定的标记处的语句或者语句块。的标记处的语句或者语句块。GOTO语句既可以向上跳转,语句既可以向上跳转,也可以向下跳转。也可以向下跳转。.19.4.1 GOTO19.4.1 GOTO语句语句DECLAREv_count INT:=1;-定义表示计数器的变量定义表示计数器的变量v_sum INT:=0;-定义表示定义表示1到到10加和的变量加和的变量BEGINLOOPv_sum=v_ sum+1;-计算计算1到到10的加和的加和IF count=10 THEN GOTO quit;-跳出循环跳出循环END IF;v_count:=v_count+1;-计数变量
48、加计数变量加1END LOOP;-quit标记标记DBMS_OUTPUT.PUT_LINE(v_sum=|v_sum);END;.19.4.1 GOTO19.4.1 GOTO语句语句PL/SQL中对中对GOTO语句做了一些限制。有些情况下,语句做了一些限制。有些情况下,使用使用GOTO语句执行跳转操作是非法。例如,不能使用语句执行跳转操作是非法。例如,不能使用GOTO语句跳转到语句跳转到IF语句中,因为如果允许语句中,因为如果允许GOTO语句跳转语句跳转到到IF语句中,那么即使语句中,那么即使IF语句中的判断条件不为语句中的判断条件不为TRUE,IF语句中的程序也可以被执行,那样是不符合逻辑的
49、。同样道语句中的程序也可以被执行,那样是不符合逻辑的。同样道理,也不能使用理,也不能使用GOTO语句跳转到语句跳转到CASE语句、循环语句中语句、循环语句中。下面是一些非法使用。下面是一些非法使用GOTO语句的介绍。语句的介绍。.19.4.1 GOTO19.4.1 GOTO语句语句使用使用GOTO语句跳转到语句跳转到IF语句、语句、CASE语句、语句、LOOP循循环语句或者内层的语句块中是不允许的。环语句或者内层的语句块中是不允许的。BEGIN .GOTO insert _row;-不能跳转到不能跳转到IF语句中语句中 .IF deptID=10 THEN .INSERT INTO.END I
50、F;END;.19.4.1 GOTO19.4.1 GOTO语句语句使用使用GOTO语句从一个语句从一个IF语句的一个分支跳转到另一个语句的一个分支跳转到另一个分支是非法的。分支是非法的。BEGIN .IF deptID=10 THEN .GOTO insert _row;-不能跳转到一个不能跳转到一个IF语句中的语句中的ELSE分支中分支中 ELSE .INSERT INTO t_student.END IF;END;.19.4.1 GOTO19.4.1 GOTO语句语句使用使用GOTO语句从语句从CASE语句中的一个语句中的一个WHEN子句跳转到另子句跳转到另一个一个WHEN子句是非法的。子
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。