`

oracle PL/SQL的基本构成,结构控制语句,分支结构,选择结构,loop循环结构,

 
阅读更多

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℃,则显示“温度偏高”。
输入并执行以下程序:
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2.         DECLARE  
  3.          V_temprature       NUMBER(5):=32;   
  4.          V_result           BOOLEAN:=false;   
  5.          BEGIN  
  6.           V_result:= v_temprature >30;   
  7.          IF V_result THEN    
  8.             DBMS_OUTPUT.PUT_LINE('温度'|| V_temprature ||'度,偏高');   
  9.          END IF;    
  10.         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;

执行结果为:
Sql代码 复制代码 收藏代码
  1. 温度32度,偏高   
  2.         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】  根据性别,显示尊称。
输入并执行以下程序:
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2.         DECLARE  
  3.         v_sex   VARCHAR2(2);   
  4.         v_titil     VARCHAR2(10);   
  5. BEGIN  
  6.   v_sex:='男';   
  7.   IF v_sex ='男' THEN  
  8.     v_titil:='先生';   
  9.   ELSE  
  10.     v_titil:='女士';   
  11.   END IF;    
  12.   DBMS_OUTPUT.PUT_LINE(v_titil||'您好!');   
  13. 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;

执行结果为:
Sql代码 复制代码 收藏代码
  1. 先生您好!   
  2.         PL/SQL 过程已成功完成。  
先生您好!
		PL/SQL 过程已成功完成。

说明:该程序根据性别显示尊称和问候,无论性别的值为何,总会有显示结果输出。如果V_sex的值不是‘男’和‘女’,那么输出结果会是什么?
【练习1】对以上程序进行补充修改,在ELSE部分嵌入一个IF结构,如果V_sex的值不是'女',则显示“朋友你好”。
3.IF-THEN-ELSIF-ELSE-END IF形式
这种形式的练习如下:
【训练3】  根据雇员工资分级显示税金。
输入并运行以下程序:
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2. DECLARE  
  3.   v_sal  NUMBER(5);   
  4.   v_tax  NUMBER(5,2);   
  5. BEGIN  
  6.   SELECT sal INTO v_sal   
  7.   FROM emp   
  8.   WHERE empno=7788;   
  9. IF v_sal >=3000 THEN    
  10.             V_tax:= v_sal*0.08;--税率8%   
  11.          ELSIF v_sal>=1500 THEN  
  12.              V_tax:= v_sal*0.06; --税率6%   
  13.         ELSE  
  14.              V_tax:= v_sal*0.04; --税率4%   
  15.          END IF;   
  16.         DBMS_OUTPUT.PUT_LINE('应缴税金:'||V_tax);   
  17.         END;  
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;

执行结果为:
Sql代码 复制代码 收藏代码
  1. 应缴税金:240   
  2.         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结构实现职务转换。
输入并执行程序:
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2. DECLARE  
  3. v_job  VARCHAR2(10);   
  4. BEGIN  
  5. SELECT job INTO v_job   
  6. FROM emp   
  7. WHERE empno=7788;   
  8. CASE v_job   
  9. WHEN 'PRESIDENT' THEN    
  10.  DBMS_OUTPUT.PUT_LINE('雇员职务:总裁');   
  11. WHEN 'MANAGER' THEN     
  12.  DBMS_OUTPUT.PUT_LINE('雇员职务:经理');   
  13. WHEN 'SALESMAN' THEN     
  14.  DBMS_OUTPUT.PUT_LINE('雇员职务:推销员');   
  15. WHEN 'ANALYST' THEN     
  16.  DBMS_OUTPUT.PUT_LINE('雇员职务:系统分析员');   
  17. WHEN 'CLERK' THEN     
  18.  DBMS_OUTPUT.PUT_LINE('雇员职务:职员');   
  19. ELSE     
  20.  DBMS_OUTPUT.PUT_LINE('雇员职务:未知');   
  21. END CASE;   
  22. END;  
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;

执行结果:
Sql代码 复制代码 收藏代码
  1. 雇员职务:系统分析员   
  2.         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的表达式结构。
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2.         DECLARE  
  3.               v_grade   VARCHAR2(10);   
  4.              v_result   VARCHAR2(10);   
  5.         BEGIN  
  6.              v_grade:='B';   
  7.              v_result:=CASE v_grade   
  8.               WHEN 'A' THEN '优'  
  9. WHEN 'B' THEN '良'  
  10.             WHEN 'C' THEN '中'  
  11.              WHEN 'D' THEN '差'  
  12.             ELSE '未知'  
  13.         END;   
  14.         DBMS_OUTPUT.PUT_LINE('评价等级:'||V_result);   
  15.         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;

执行结果为:
Sql代码 复制代码 收藏代码
  1. 评价等级:良   
  2.         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的搜索结构。
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2.         DECLARE  
  3.            v_sal    NUMBER(5);   
  4.         BEGIN  
  5.            SELECT sal INTO v_sal FROM emp    
  6.              WHERE empno=7788;   
  7.         CASE    
  8.             WHEN v_sal>=3000 THEN    
  9.         DBMS_OUTPUT.PUT_LINE('工资等级:高');   
  10.              WHEN v_sal>=1500 THEN  
  11. DBMS_OUTPUT.PUT_LINE('工资等级:中');   
  12.        ELSE  
  13.    DBMS_OUTPUT.PUT_LINE('工资等级:低');   
  14. END CASE;   
  15. 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 THEN
DBMS_OUTPUT.PUT_LINE('工资等级:中');
	   ELSE
   DBMS_OUTPUT.PUT_LINE('工资等级:低');
END CASE;
END;

执行结果为:
Sql代码 复制代码 收藏代码
  1. 工资等级:高   
  2.         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 的值。
输入并执行以下程序:
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2.         DECLARE  
  3.          v_total        NUMBER(5):=0;   
  4.         v_count     NUMBER(5):=1;   
  5.         BEGIN  
  6.         LOOP   
  7.             v_total:=v_total+v_count**2;   
  8.             EXIT WHEN v_count=15;--条件退出   
  9. v_count:=v_count+2;   
  10.         END LOOP;   
  11.          DBMS_OUTPUT.PUT_LINE(v_total);   
  12.         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;

输出结果为:
Sql代码 复制代码 收藏代码
  1. 680   
  2.         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循环输出图形。
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2.         BEGIN  
  3.         FOR I IN 1..8    
  4.         LOOP   
  5.         DBMS_OUTPUT.PUT_LINE(to_char(i)||rpad('*',I,'*'));   
  6.         END LOOP;   
  7.         END;  
SET SERVEROUTPUT ON
		BEGIN
		FOR I IN 1..8 
		LOOP
	    DBMS_OUTPUT.PUT_LINE(to_char(i)||rpad('*',I,'*'));
		END LOOP;
		END;

输出结果为:
Sql代码 复制代码 收藏代码
  1. 1*   
  2. 2**   
  3. 3***   
  4. 4****   
  5. 5*****   
  6. 6******   
  7. 7*******   
  8. 8********   
  9.         PL/SQL 过程已成功完成。   
1*
2**
3***
4****
5*****
6******
7*******
8********
		PL/SQL 过程已成功完成。 

说明:该程序在循环中使用了循环控制变量I,该变量隐含定义。在每次循环中根据循环控制变量I的值,使用RPAD函数控制显示相应个数的“*”。
【练习2】为以上程序增加REVERSE关键字,观察执行结果。
【训练3】  输出一个空心三角形。
Sql代码 复制代码 收藏代码
  1. BEGIN    
  2.         FOR I IN 1..9   
  3.         LOOP    
  4.          IF I=1 OR I=9 THEN  
  5.          DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad(' ',12-I,' ')||rpad('*',2*i-1,'*'));    
  6. ELSE  
  7.       DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad(' ',12-I,' ')||'*'||rpad(' ',I*2-3,' ')||'*');    
  8.         END IF;   
  9.         END LOOP;    
  10.         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;

输出结果为:
Sql代码 复制代码 收藏代码
  1. 1           *   
  2. 2          * *   
  3. 3         *   *   
  4. 4        *     *   
  5. 5       *       *   
  6. 6      *         *   
  7. 7     *           *   
  8. 8    *             *   
  9. 9   *****************   
  10. 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:执行下面的程序:
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2. DECLARE  
  3. v_count NUMBER(2) := 1;   
  4. BEGIN  
  5.   WHILE v_count <6 LOOP   
  6.     INSERT INTO emp(empno, ename)   
  7.     VALUES (5000+v_count, '临时');   
  8. v_count := v_count + 1;   
  9.   END LOOP;   
  10.   COMMIT;   
  11. END;  
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;

输出结果为:
Sql代码 复制代码 收藏代码
  1. PL/SQL 过程已成功完成。  
PL/SQL 过程已成功完成。

步骤2:显示插入的记录:
Sql代码 复制代码 收藏代码
  1. SELECT empno,ename FROM emp WHERE ename='临时';  
SELECT empno,ename FROM emp WHERE ename='临时';

输出结果为:
   
Sql代码 复制代码 收藏代码
  1. EMPNO ENAME   
  2.         ------------------ ----------   
  3.       5001 临时   
  4.       5002 临时   
  5.       5003 临时   
  6.       5004 临时   
  7.       5005 临时   
  8.         已选择5行。  
EMPNO ENAME
		------------------ ----------
      5001 临时
      5002 临时
      5003 临时
      5004 临时
      5005 临时
		已选择5行。

步骤3:删除插入的记录:
Sql代码 复制代码 收藏代码
  1. DELETE FROM emp WHERE ename='临时';   
  2.         COMMIT;  
DELETE FROM emp WHERE ename='临时';
		COMMIT;

输出结果为:
Sql代码 复制代码 收藏代码
  1. 已删除5行。   
  2.         提交完成。  
已删除5行。
		提交完成。

说明:该练习使用WHILE循环向emp表插入5个新记录(雇员编号根据循环变量生成),并通过查询语句显示新插入的记录,然后删除。
4.多重循环
循环可以嵌套,以下是一个二重循环的练习。
【训练4】 使用二重循环求1!+2!+...+10!的值。
步骤1:第1种算法:
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2. DECLARE  
  3.   v_total   NUMBER(8):=0;   
  4.   v_ni  NUMBER(8):=0;   
  5.   J     NUMBER(5);   
  6. BEGIN  
  7. FOR I IN 1..10   
  8.   LOOP   
  9.     J:=1;   
  10.       v_ni:=1;   
  11.     WHILE J<=I   
  12.     LOOP   
  13.       v_ni:= v_ni*J;   
  14.       J:=J+1;   
  15.     END LOOP;--内循环求n!   
  16. v_total:=v_total+v_ni;   
  17.   END LOOP;--外循环求总和   
  18.   DBMS_OUTPUT.PUT_LINE(v_total);   
  19. END;  
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;

输出结果为:
Sql代码 复制代码 收藏代码
  1. 4037913   
  2. PL/SQL 过程已成功完成。  
4037913
PL/SQL 过程已成功完成。

步骤2:第2种算法:
Sql代码 复制代码 收藏代码
  1. SET SERVEROUTPUT ON  
  2. DECLARE  
  3.   v_total       NUMBER(8):=0;   
  4.   v_ni      NUMBER(8):=1;   
  5. BEGIN  
  6.   FOR I IN 1..10   
  7.   LOOP   
  8.     v_ni:= v_ni*I;  --求n!   
  9.     v_total:= v_total+v_ni;   
  10.   END LOOP;     --循环求总和   
  11.   DBMS_OUTPUT.PUT_LINE(v_total);   
  12. END;  
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;

输出结果为:
Sql代码 复制代码 收藏代码
  1. 409114   
  2.         PL/SQL 过程已成功完成。   
409114
		PL/SQL 过程已成功完成。 

说明:第1种算法的程序内循环使用WHILE循环求阶层,外循环使用FOR循环求总和。第2种算法是简化的算法,根据是:n!=n*(n?1)!。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics