oracle PL/SQL的基本构成,结构控制语句,分支结构,选择结构,loop循环结构
分支结构 
分支结构是最基本的程序结构,分支结构由IF语句实现。
使用IF语句,根据条件可以改变程序的逻辑流程。IF语句有如下的形式:
IF 条件1 THEN
语句序列1;
[ELSIF 条件2 THEN
语句序列2;
ELSE
语句序列n;]
END IF;
其中:
? 条件部分是一个逻辑表达式,值只能是真(TRUE)、假(FALSE)或空(NULL)。
语句序列为多条可执行的语句。
根据具体情况,分支结构可以有以下几种形式:
IF-THEN-END IF
IF-THEN-ELSE-END IF
IF-THEN-ELSIF-ELSE-END IF
1.IF-THEN-END IF形式
这是最简单的IF结构,练习如下:
【训练1】? 如果温度大于30℃,则显示“温度偏高”。
输入并执行以下程序:
执行结果为:
说明:该程序中使用了布尔变量,初值为false,表示温度低于30℃。表达式v_temprature >30返回值为布尔型,赋给逻辑变量V_result。如果变量v_temprature的值大于30,则返回值为真,否则为假。V_result值为真就会执行IF到 END IF之间的输出语句,否则没有输出结果。
试修改温度的初值为25℃,重新执行,观察结果。
2.IF-THEN-ELSE-END IF形式
这种形式的练习如下:
【训练2】? 根据性别,显示尊称。
输入并执行以下程序:
执行结果为:
说明:该程序根据性别显示尊称和问候,无论性别的值为何,总会有显示结果输出。如果V_sex的值不是‘男’和‘女’,那么输出结果会是什么?
【练习1】对以上程序进行补充修改,在ELSE部分嵌入一个IF结构,如果V_sex的值不是'女',则显示“朋友你好”。
3.IF-THEN-ELSIF-ELSE-END IF形式
这种形式的练习如下:
【训练3】? 根据雇员工资分级显示税金。
输入并运行以下程序:
执行结果为:
说明:该程序根据工资计算7788号雇员应缴税金,不同工资级别的税率不同。
选择结构
CASE语句适用于分情况的多分支处理,可有以下三种用法。
1.基本CASE结构
语句的语法如下:
CASE 选择变量名
WHEN 表达式1 THEN
语句序列1
WHEN 表达式2 THEN
? 语句序列2
WHEN 表达式n THEN
? 语句序列n
ELSE
? 语句序列n+1
END CASE;
在整个结构中,选择变量的值同表达式的值进行顺序匹配,如果相等,则执行相应的语句序列,如果不等,则执行ELSE部分的语句序列。
以下是一个使用CASE选择结构的练习。
【训练1】? 使用CASE结构实现职务转换。
输入并执行程序:
执行结果:
说明:以上实例检索雇员7788的职务,通过CASE结构转换成中文输出。
【练习1】将雇员号修改成其他已知雇员号,重新执行。
2.表达式结构CASE语句
在Oracle中,CASE结构还能以赋值表达式的形式出现,它根据选择变量的值求得不同的结果。
它的基本结构如下:
变量=CASE 选择变量名
WHEN 表达式1 THEN 值1
WHEN 表达式2 THEN 值2
WHEN 表达式n THEN 值n
ELSE值n+1
END;
【训练2】? 使用CASE的表达式结构。
执行结果为:
说明:该CASE表达式通过判断变量v_grade的值,对变量V_result赋予不同的值。
3.搜索CASE结构
Oracle还提供了一种搜索CASE结构,它没有选择变量,直接判断条件表达式的值,根据条件表达式决定转向。
CASE
WHEN 条件表达式1 THEN
? 语句序列1
WHEN 条件表达式2 THEN
? 语句序列2
WHEN 条件表达式n THEN
? 语句序列n
ELSE
? 语句序列n+1
END CASE;
【训练3】? 使用CASE的搜索结构。
执行结果为:
说明:此结构类似于IF-THEN-ELSIF-ELSE-END IF结构。本训练判断7788雇员的工资等级。
循环结构
循环结构是最重要的程序控制结构,用来控制反复执行一段程序。比如我们要进行累加,则可以通过适当的循环程序实现。PL/SQL循环结构可划分为以下3种:
* 基本LOOP循环。
* FOR LOOP循环。
* WHILE LOOP循环。
1.基本LOOP循环
基本循环的结构如下:
LOOP --循环起始标识
语句1;
? 语句2;
EXIT [WHEN 条件];
END LOOP; --循环结束标识
该循环的作用是反复执行LOOP与END LOOP之间的语句。
EXIT用于在循环过程中退出循环,WHEN用于定义EXIT的退出条件。如果没有WHEN条件,遇到EXIT语句则无条件退出循环。
【训练1】 求:12+32+52+...+152 的值。
输入并执行以下程序:
输出结果为:
说明:基本循环一定要使用EXIT退出,否则就会成为死循环。
【练习1】求1*2*3*4*...*10的值。
2.FOR LOOP循环
FOR循环是固定次数循环,格式如下:
FOR 控制变量 in [REVERSE] 下限..上限
LOOP
语句1;
? 语句2;
?? END LOOP;
循环控制变量是隐含定义的,不需要声明。
下限和上限用于指明循环次数。正常情况下循环控制变量的取值由下限到上限递增,REVERSE关键字表示循环控制变量的取值由上限到下限递减。
以下是FOR循环结构的练习。
【训练2】? 用FOR循环输出图形。
输出结果为:
说明:该程序在循环中使用了循环控制变量I,该变量隐含定义。在每次循环中根据循环控制变量I的值,使用RPAD函数控制显示相应个数的“*”。
【练习2】为以上程序增加REVERSE关键字,观察执行结果。
【训练3】? 输出一个空心三角形。
输出结果为:
? 说明:该实例采用循环和IF结构相结合,对第1行和第9行(I=1 OR I=9)执行同样的输出语句,其他行执行另外的输出语句。
【练习3】修改程序,输出一个实心三角形。
3.WHILE LOOP循环
WHILE循环是有条件循环,其格式如下:
WHILE 条件
LOOP
语句1;
语句2;
END LOOP;
当条件满足时,执行循环体;当条件不满足时,则结束循环。如果第一次判断条件为假,则不执行循环体。
以下是WHILE循环结构的练习。
【训练3】 使用WHILE 循环向emp表连续插入5个记录。
步骤1:执行下面的程序:
输出结果为:
步骤2:显示插入的记录:
输出结果为:
???
步骤3:删除插入的记录:
输出结果为:
说明:该练习使用WHILE循环向emp表插入5个新记录(雇员编号根据循环变量生成),并通过查询语句显示新插入的记录,然后删除。
4.多重循环
循环可以嵌套,以下是一个二重循环的练习。
【训练4】 使用二重循环求1!+2!+...+10!的值。
步骤1:第1种算法:
输出结果为:
步骤2:第2种算法:
输出结果为:
说明:第1种算法的程序内循环使用WHILE循环求阶层,外循环使用FOR循环求总和。第2种算法是简化的算法,根据是:n!=n*(n?1)!。
                  分支结构是最基本的程序结构,分支结构由IF语句实现。
使用IF语句,根据条件可以改变程序的逻辑流程。IF语句有如下的形式:
IF 条件1 THEN
语句序列1;
[ELSIF 条件2 THEN
语句序列2;
ELSE
语句序列n;]
END IF;
其中:
? 条件部分是一个逻辑表达式,值只能是真(TRUE)、假(FALSE)或空(NULL)。
语句序列为多条可执行的语句。
根据具体情况,分支结构可以有以下几种形式:
IF-THEN-END IF
IF-THEN-ELSE-END IF
IF-THEN-ELSIF-ELSE-END IF
1.IF-THEN-END IF形式
这是最简单的IF结构,练习如下:
【训练1】? 如果温度大于30℃,则显示“温度偏高”。
输入并执行以下程序:
- SET?SERVEROUTPUT?ON??
 - ????????DECLARE??
 - ?????????V_temprature???????NUMBER(5):=32; ??
 - ?????????V_result???????????BOOLEAN:=false; ??
 - ?????????BEGIN??
 - ??????????V_result:=?v_temprature?>30; ??
 - ?????????IF?V_result?THEN? ??
 - ????????????DBMS_OUTPUT.PUT_LINE('温度'||?V_temprature?||'度,偏高'); ??
 - ?????????END?IF;? ??
 - ????????END;??
 
SET SERVEROUTPUT ON		DECLARE 		 V_temprature		NUMBER(5):=32; 		 V_result         	BOOLEAN:=false;		 BEGIN		  V_result:= v_temprature >30; 		 IF V_result THEN     		DBMS_OUTPUT.PUT_LINE('温度'|| V_temprature ||'度,偏高'); 		 END IF; 		END;执行结果为:
- 温度32度,偏高 ??
 - ????????PL/SQL过程已成功完成。??
 
温度32度,偏高 PL/SQL过程已成功完成。
说明:该程序中使用了布尔变量,初值为false,表示温度低于30℃。表达式v_temprature >30返回值为布尔型,赋给逻辑变量V_result。如果变量v_temprature的值大于30,则返回值为真,否则为假。V_result值为真就会执行IF到 END IF之间的输出语句,否则没有输出结果。
试修改温度的初值为25℃,重新执行,观察结果。
2.IF-THEN-ELSE-END IF形式
这种形式的练习如下:
【训练2】? 根据性别,显示尊称。
输入并执行以下程序:
- SET?SERVEROUTPUT?ON??
 - ????????DECLARE??
 - ????????v_sex???VARCHAR2(2); ??
 - ????????v_titil?????VARCHAR2(10); ??
 - BEGIN??
 - ??v_sex:='男'; ??
 - ??IF?v_sex?='男'?THEN??
 - ????v_titil:='先生'; ??
 - ??ELSE??
 - ????v_titil:='女士'; ??
 - ??END?IF;? ??
 - ??DBMS_OUTPUT.PUT_LINE(v_titil||'您好!'); ??
 - END;??
 
SET SERVEROUTPUT ON DECLARE v_sex VARCHAR2(2); v_titil VARCHAR2(10);BEGIN v_sex:='男'; IF v_sex ='男' THEN v_titil:='先生'; ELSE v_titil:='女士'; END IF; DBMS_OUTPUT.PUT_LINE(v_titil||'您好!');END;
执行结果为:
- 先生您好! ??
 - ????????PL/SQL?过程已成功完成。??
 
先生您好! PL/SQL 过程已成功完成。
说明:该程序根据性别显示尊称和问候,无论性别的值为何,总会有显示结果输出。如果V_sex的值不是‘男’和‘女’,那么输出结果会是什么?
【练习1】对以上程序进行补充修改,在ELSE部分嵌入一个IF结构,如果V_sex的值不是'女',则显示“朋友你好”。
3.IF-THEN-ELSIF-ELSE-END IF形式
这种形式的练习如下:
【训练3】? 根据雇员工资分级显示税金。
输入并运行以下程序:
- SET?SERVEROUTPUT?ON??
 - DECLARE??
 - ??v_sal??NUMBER(5); ??
 - ??v_tax??NUMBER(5,2); ??
 - BEGIN??
 - ??SELECT?sal?INTO?v_sal ??
 - ??FROM?emp ??
 - ??WHERE?empno=7788; ??
 - IF?v_sal?>=3000?THEN? ??
 - ????????????V_tax:=?v_sal*0.08;--税率8% ??
 - ?????????ELSIF?v_sal>=1500?THEN??
 - ?????????????V_tax:=?v_sal*0.06;?--税率6% ??
 - ????????ELSE??
 - ?????????????V_tax:=?v_sal*0.04;?--税率4% ??
 - ?????????END?IF; ??
 - ????????DBMS_OUTPUT.PUT_LINE('应缴税金:'||V_tax); ??
 - ????????END;??
 
SET SERVEROUTPUT ONDECLARE  v_sal  NUMBER(5);  v_tax  NUMBER(5,2);BEGIN  SELECT sal INTO v_sal  FROM emp  WHERE empno=7788;IF v_sal >=3000 THEN   	 		V_tax:= v_sal*0.08;--税率8% 		 ELSIF v_sal>=1500 THEN  			 V_tax:= v_sal*0.06; --税率6%  		ELSE  			 V_tax:= v_sal*0.04; --税率4% 		 END IF;  		DBMS_OUTPUT.PUT_LINE('应缴税金:'||V_tax);		END;执行结果为:
- 应缴税金:240 ??
 - ????????PL/SQL?过程已成功完成。??
 
应缴税金:240 PL/SQL 过程已成功完成。
说明:该程序根据工资计算7788号雇员应缴税金,不同工资级别的税率不同。
选择结构
CASE语句适用于分情况的多分支处理,可有以下三种用法。
1.基本CASE结构
语句的语法如下:
CASE 选择变量名
WHEN 表达式1 THEN
语句序列1
WHEN 表达式2 THEN
? 语句序列2
WHEN 表达式n THEN
? 语句序列n
ELSE
? 语句序列n+1
END CASE;
在整个结构中,选择变量的值同表达式的值进行顺序匹配,如果相等,则执行相应的语句序列,如果不等,则执行ELSE部分的语句序列。
以下是一个使用CASE选择结构的练习。
【训练1】? 使用CASE结构实现职务转换。
输入并执行程序:
- SET?SERVEROUTPUT?ON??
 - DECLARE??
 - v_job??VARCHAR2(10); ??
 - BEGIN??
 - SELECT?job?INTO?v_job ??
 - FROM?emp ??
 - WHERE?empno=7788; ??
 - CASE?v_job ??
 - WHEN?'PRESIDENT'?THEN? ??
 - ?DBMS_OUTPUT.PUT_LINE('雇员职务:总裁'); ??
 - WHEN?'MANAGER'?THEN?? ??
 - ?DBMS_OUTPUT.PUT_LINE('雇员职务:经理'); ??
 - WHEN?'SALESMAN'?THEN?? ??
 - ?DBMS_OUTPUT.PUT_LINE('雇员职务:推销员'); ??
 - WHEN?'ANALYST'?THEN?? ??
 - ?DBMS_OUTPUT.PUT_LINE('雇员职务:系统分析员'); ??
 - WHEN?'CLERK'?THEN?? ??
 - ?DBMS_OUTPUT.PUT_LINE('雇员职务:职员'); ??
 - ELSE?? ??
 - ?DBMS_OUTPUT.PUT_LINE('雇员职务:未知'); ??
 - END?CASE; ??
 - END;??
 
SET SERVEROUTPUT ONDECLAREv_job  VARCHAR2(10);BEGINSELECT job INTO v_jobFROM empWHERE empno=7788;CASE v_jobWHEN 'PRESIDENT' THEN  DBMS_OUTPUT.PUT_LINE('雇员职务:总裁');WHEN 'MANAGER' THEN   DBMS_OUTPUT.PUT_LINE('雇员职务:经理');WHEN 'SALESMAN' THEN   DBMS_OUTPUT.PUT_LINE('雇员职务:推销员');WHEN 'ANALYST' THEN   DBMS_OUTPUT.PUT_LINE('雇员职务:系统分析员');WHEN 'CLERK' THEN   DBMS_OUTPUT.PUT_LINE('雇员职务:职员');ELSE   DBMS_OUTPUT.PUT_LINE('雇员职务:未知');END CASE;END;执行结果:
- 雇员职务:系统分析员 ??
 - ????????PL/SQL?过程已成功完成。???
 
雇员职务:系统分析员 PL/SQL 过程已成功完成。?
说明:以上实例检索雇员7788的职务,通过CASE结构转换成中文输出。
【练习1】将雇员号修改成其他已知雇员号,重新执行。
2.表达式结构CASE语句
在Oracle中,CASE结构还能以赋值表达式的形式出现,它根据选择变量的值求得不同的结果。
它的基本结构如下:
变量=CASE 选择变量名
WHEN 表达式1 THEN 值1
WHEN 表达式2 THEN 值2
WHEN 表达式n THEN 值n
ELSE值n+1
END;
【训练2】? 使用CASE的表达式结构。
- SET?SERVEROUTPUT?ON??
 - ????????DECLARE??
 - ??????????????v_grade???VARCHAR2(10); ??
 - ?????????????v_result???VARCHAR2(10); ??
 - ????????BEGIN??
 - ?????????????v_grade:='B'; ??
 - ?????????????v_result:=CASE?v_grade ??
 - ??????????????WHEN?'A'?THEN?'优'??
 - WHEN?'B'?THEN?'良'??
 - ????????????WHEN?'C'?THEN?'中'??
 - ?????????????WHEN?'D'?THEN?'差'??
 - ????????????ELSE?'未知'??
 - ????????END; ??
 - ????????DBMS_OUTPUT.PUT_LINE('评价等级:'||V_result); ??
 - ????????END;??
 
SET SERVEROUTPUT ON		DECLARE			  v_grade	VARCHAR2(10);	 		 v_result	VARCHAR2(10);		BEGIN	 		 v_grade:='B';	 		 v_result:=CASE v_grade			  WHEN 'A' THEN '优'WHEN 'B' THEN '良'	  		WHEN 'C' THEN '中'	 		 WHEN 'D' THEN '差'			ELSE '未知'		END; 		DBMS_OUTPUT.PUT_LINE('评价等级:'||V_result);		END;执行结果为:
- 评价等级:良 ??
 - ????????PL/SQL?过程已成功完成。??
 
评价等级:良 PL/SQL 过程已成功完成。
说明:该CASE表达式通过判断变量v_grade的值,对变量V_result赋予不同的值。
3.搜索CASE结构
Oracle还提供了一种搜索CASE结构,它没有选择变量,直接判断条件表达式的值,根据条件表达式决定转向。
CASE
WHEN 条件表达式1 THEN
? 语句序列1
WHEN 条件表达式2 THEN
? 语句序列2
WHEN 条件表达式n THEN
? 语句序列n
ELSE
? 语句序列n+1
END CASE;
【训练3】? 使用CASE的搜索结构。
- SET?SERVEROUTPUT?ON??
 - ????????DECLARE??
 - ???????????v_sal????NUMBER(5); ??
 - ????????BEGIN??
 - ???????????SELECT?sal?INTO?v_sal?FROM?emp? ??
 - ?????????????WHERE?empno=7788; ??
 - ????????CASE? ??
 - ????????????WHEN?v_sal>=3000?THEN? ??
 - ????????DBMS_OUTPUT.PUT_LINE('工资等级:高'); ??
 - ?????????????WHEN?v_sal>=1500?THEN??
 - DBMS_OUTPUT.PUT_LINE('工资等级:中'); ??
 - ???????ELSE??
 - ???DBMS_OUTPUT.PUT_LINE('工资等级:低'); ??
 - END?CASE; ??
 - END;??
 
SET SERVEROUTPUT ON		DECLARE		   v_sal	NUMBER(5);		BEGIN		   SELECT sal INTO v_sal FROM emp 	  		 WHERE empno=7788;		CASE 	   		WHEN v_sal>=3000 THEN    		DBMS_OUTPUT.PUT_LINE('工资等级:高');	  		 WHEN v_sal>=1500 THENDBMS_OUTPUT.PUT_LINE('工资等级:中');	   ELSE   DBMS_OUTPUT.PUT_LINE('工资等级:低');END CASE;END;执行结果为:
- 工资等级:高 ??
 - ????????PL/SQL?过程已成功完成。???
 
工资等级:高 PL/SQL 过程已成功完成。?
说明:此结构类似于IF-THEN-ELSIF-ELSE-END IF结构。本训练判断7788雇员的工资等级。
循环结构
循环结构是最重要的程序控制结构,用来控制反复执行一段程序。比如我们要进行累加,则可以通过适当的循环程序实现。PL/SQL循环结构可划分为以下3种:
* 基本LOOP循环。
* FOR LOOP循环。
* WHILE LOOP循环。
1.基本LOOP循环
基本循环的结构如下:
LOOP --循环起始标识
语句1;
? 语句2;
EXIT [WHEN 条件];
END LOOP; --循环结束标识
该循环的作用是反复执行LOOP与END LOOP之间的语句。
EXIT用于在循环过程中退出循环,WHEN用于定义EXIT的退出条件。如果没有WHEN条件,遇到EXIT语句则无条件退出循环。
【训练1】 求:12+32+52+...+152 的值。
输入并执行以下程序:
- SET?SERVEROUTPUT?ON??
 - ????????DECLARE??
 - ?????????v_total????????NUMBER(5):=0; ??
 - ????????v_count?????NUMBER(5):=1; ??
 - ????????BEGIN??
 - ????????LOOP ??
 - ????????????v_total:=v_total+v_count**2; ??
 - ????????????EXIT?WHEN?v_count=15;--条件退出 ??
 - v_count:=v_count+2; ??
 - ????????END?LOOP; ??
 - ?????????DBMS_OUTPUT.PUT_LINE(v_total); ??
 - ????????END;??
 
SET SERVEROUTPUT ON DECLARE v_total NUMBER(5):=0; v_count NUMBER(5):=1; BEGIN LOOP v_total:=v_total+v_count**2; EXIT WHEN v_count=15;--条件退出v_count:=v_count+2; END LOOP; DBMS_OUTPUT.PUT_LINE(v_total); END;
输出结果为:
- 680 ??
 - ????????PL/SQL?过程已成功完成。??
 
680 PL/SQL 过程已成功完成。
说明:基本循环一定要使用EXIT退出,否则就会成为死循环。
【练习1】求1*2*3*4*...*10的值。
2.FOR LOOP循环
FOR循环是固定次数循环,格式如下:
FOR 控制变量 in [REVERSE] 下限..上限
LOOP
语句1;
? 语句2;
?? END LOOP;
循环控制变量是隐含定义的,不需要声明。
下限和上限用于指明循环次数。正常情况下循环控制变量的取值由下限到上限递增,REVERSE关键字表示循环控制变量的取值由上限到下限递减。
以下是FOR循环结构的练习。
【训练2】? 用FOR循环输出图形。
- SET?SERVEROUTPUT?ON??
 - ????????BEGIN??
 - ????????FOR?I?IN?1..8? ??
 - ????????LOOP ??
 - ????????DBMS_OUTPUT.PUT_LINE(to_char(i)||rpad('*',I,'*')); ??
 - ????????END?LOOP; ??
 - ????????END;??
 
SET SERVEROUTPUT ON		BEGIN		FOR I IN 1..8 		LOOP	    DBMS_OUTPUT.PUT_LINE(to_char(i)||rpad('*',I,'*'));		END LOOP;		END;输出结果为:
- 1* ??
 - 2** ??
 - 3*** ??
 - 4**** ??
 - 5***** ??
 - 6****** ??
 - 7******* ??
 - 8******** ??
 - ????????PL/SQL?过程已成功完成。???
 
1*2**3***4****5*****6******7*******8******** PL/SQL 过程已成功完成。?
说明:该程序在循环中使用了循环控制变量I,该变量隐含定义。在每次循环中根据循环控制变量I的值,使用RPAD函数控制显示相应个数的“*”。
【练习2】为以上程序增加REVERSE关键字,观察执行结果。
【训练3】? 输出一个空心三角形。
- BEGIN? ??
 - ????????FOR?I?IN?1..9 ??
 - ????????LOOP? ??
 - ?????????IF?I=1?OR?I=9?THEN??
 - ?????????DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad('?',12-I,'?')||rpad('*',2*i-1,'*'));? ??
 - ELSE??
 - ??????DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad('?',12-I,'?')||'*'||rpad('?',I*2-3,'?')||'*');? ??
 - ????????END?IF; ??
 - ????????END?LOOP;? ??
 - ????????END;??
 
BEGIN 		FOR I IN 1..9		LOOP 		 IF I=1 OR I=9 THEN 		 DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad(' ',12-I,' ')||rpad('*',2*i-1,'*')); ELSE	  DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad(' ',12-I,' ')||'*'||rpad(' ',I*2-3,' ')||'*');  		END IF;		END LOOP; 		END;输出结果为:
- 1???????????* ??
 - 2??????????*?* ??
 - 3?????????*???* ??
 - 4????????*?????* ??
 - 5???????*???????* ??
 - 6??????*?????????* ??
 - 7?????*???????????* ??
 - 8????*?????????????* ??
 - 9???***************** ??
 - PL/SQL?过程已成功完成。??
 
1 *2 * *3 * *4 * *5 * *6 * *7 * *8 * *9 *****************PL/SQL 过程已成功完成。
? 说明:该实例采用循环和IF结构相结合,对第1行和第9行(I=1 OR I=9)执行同样的输出语句,其他行执行另外的输出语句。
【练习3】修改程序,输出一个实心三角形。
3.WHILE LOOP循环
WHILE循环是有条件循环,其格式如下:
WHILE 条件
LOOP
语句1;
语句2;
END LOOP;
当条件满足时,执行循环体;当条件不满足时,则结束循环。如果第一次判断条件为假,则不执行循环体。
以下是WHILE循环结构的练习。
【训练3】 使用WHILE 循环向emp表连续插入5个记录。
步骤1:执行下面的程序:
- SET?SERVEROUTPUT?ON??
 - DECLARE??
 - v_count?NUMBER(2)?:=?1; ??
 - BEGIN??
 - ??WHILE?v_count?<6?LOOP ??
 - ????INSERT?INTO?emp(empno,?ename) ??
 - ????VALUES?(5000+v_count,?'临时'); ??
 - v_count?:=?v_count?+?1; ??
 - ??END?LOOP; ??
 - ??COMMIT; ??
 - END;??
 
SET SERVEROUTPUT ONDECLAREv_count NUMBER(2) := 1;BEGIN WHILE v_count <6 LOOP INSERT INTO emp(empno, ename) VALUES (5000+v_count, '临时');v_count := v_count + 1; END LOOP; COMMIT;END;
输出结果为:
- PL/SQL?过程已成功完成。??
 
PL/SQL 过程已成功完成。
步骤2:显示插入的记录:
- SELECT?empno,ename?FROM?emp?WHERE?ename='临时';??
 
SELECT empno,ename FROM emp WHERE ename='临时';
输出结果为:
???
- EMPNO?ENAME ??
 - ????????------------------?---------- ??
 - ??????5001?临时 ??
 - ??????5002?临时 ??
 - ??????5003?临时 ??
 - ??????5004?临时 ??
 - ??????5005?临时 ??
 - ????????已选择5行。??
 
EMPNO ENAME ------------------ ---------- 5001 临时 5002 临时 5003 临时 5004 临时 5005 临时 已选择5行。
步骤3:删除插入的记录:
- DELETE?FROM?emp?WHERE?ename='临时'; ??
 - ????????COMMIT;??
 
DELETE FROM emp WHERE ename='临时'; COMMIT;
输出结果为:
- 已删除5行。 ??
 - ????????提交完成。??
 
已删除5行。 提交完成。
说明:该练习使用WHILE循环向emp表插入5个新记录(雇员编号根据循环变量生成),并通过查询语句显示新插入的记录,然后删除。
4.多重循环
循环可以嵌套,以下是一个二重循环的练习。
【训练4】 使用二重循环求1!+2!+...+10!的值。
步骤1:第1种算法:
- SET?SERVEROUTPUT?ON??
 - DECLARE??
 - ??v_total???NUMBER(8):=0; ??
 - ??v_ni??NUMBER(8):=0; ??
 - ??J?????NUMBER(5); ??
 - BEGIN??
 - FOR?I?IN?1..10 ??
 - ??LOOP ??
 - ????J:=1; ??
 - ??????v_ni:=1; ??
 - ????WHILE?J<=I ??
 - ????LOOP ??
 - ??????v_ni:=?v_ni*J; ??
 - ??????J:=J+1; ??
 - ????END?LOOP;--内循环求n! ??
 - v_total:=v_total+v_ni; ??
 - ??END?LOOP;--外循环求总和 ??
 - ??DBMS_OUTPUT.PUT_LINE(v_total); ??
 - END;??
 
SET SERVEROUTPUT ONDECLARE v_total NUMBER(8):=0; v_ni NUMBER(8):=0; J NUMBER(5);BEGINFOR I IN 1..10 LOOP J:=1; v_ni:=1; WHILE J<=I LOOP v_ni:= v_ni*J; J:=J+1; END LOOP;--内循环求n!v_total:=v_total+v_ni; END LOOP;--外循环求总和 DBMS_OUTPUT.PUT_LINE(v_total);END;
输出结果为:
- 4037913 ??
 - PL/SQL?过程已成功完成。??
 
4037913PL/SQL 过程已成功完成。
步骤2:第2种算法:
- SET?SERVEROUTPUT?ON??
 - DECLARE??
 - ??v_total???????NUMBER(8):=0; ??
 - ??v_ni??????NUMBER(8):=1; ??
 - BEGIN??
 - ??FOR?I?IN?1..10 ??
 - ??LOOP ??
 - ????v_ni:=?v_ni*I;??--求n! ??
 - ????v_total:=?v_total+v_ni; ??
 - ??END?LOOP;?????--循环求总和 ??
 - ??DBMS_OUTPUT.PUT_LINE(v_total); ??
 - END;??
 
SET SERVEROUTPUT ONDECLARE v_total NUMBER(8):=0; v_ni NUMBER(8):=1;BEGIN FOR I IN 1..10 LOOP v_ni:= v_ni*I; --求n! v_total:= v_total+v_ni; END LOOP; --循环求总和 DBMS_OUTPUT.PUT_LINE(v_total);END;
输出结果为:
- 409114 ??
 - ????????PL/SQL?过程已成功完成。???
 
409114 PL/SQL 过程已成功完成。?
说明:第1种算法的程序内循环使用WHILE循环求阶层,外循环使用FOR循环求总和。第2种算法是简化的算法,根据是:n!=n*(n?1)!。
?