当前位置: 代码迷 >> SQL >> oracle PL/SQL的基本构成,结构控制语句,分支结构,选择结构,loop循环结构
  详细解决方案

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

热度:54   发布时间:2016-05-05 12:27:15.0
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;??


执行结果为:?

Sql代码??收藏代码
  1. 温度32度,偏高??
  2. ????????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;??


执行结果为:?

Sql代码??收藏代码
  1. 先生您好!??
  2. ????????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;??


执行结果为:?

Sql代码??收藏代码
  1. 应缴税金:240??
  2. ????????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;??


执行结果:?

Sql代码??收藏代码
  1. 雇员职务:系统分析员??
  2. ????????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;??


执行结果为:?

Sql代码??收藏代码
  1. 评价等级:良??
  2. ????????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;??


执行结果为:?

Sql代码??收藏代码
  1. 工资等级:高??
  2. ????????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;??


输出结果为:?

Sql代码??收藏代码
  1. 680??
  2. ????????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;??


输出结果为:?

Sql代码??收藏代码
  1. 1*??
  2. 2**??
  3. 3***??
  4. 4****??
  5. 5*****??
  6. 6******??
  7. 7*******??
  8. 8********??
  9. ????????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;??


输出结果为:?

Sql代码??收藏代码
  1. 1???????????*??
  2. 2??????????*?*??
  3. 3?????????*???*??
  4. 4????????*?????*??
  5. 5???????*???????*??
  6. 6??????*?????????*??
  7. 7?????*???????????*??
  8. 8????*?????????????*??
  9. 9???*****************??
  10. 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;??


输出结果为:?

Sql代码??收藏代码
  1. PL/SQL?过程已成功完成。??


步骤2:显示插入的记录:?

Sql代码??收藏代码
  1. SELECT?empno,ename?FROM?emp?WHERE?ename='临时';??


输出结果为:?
???

Sql代码??收藏代码
  1. EMPNO?ENAME??
  2. ????????------------------?----------??
  3. ??????5001?临时??
  4. ??????5002?临时??
  5. ??????5003?临时??
  6. ??????5004?临时??
  7. ??????5005?临时??
  8. ????????已选择5行。??


步骤3:删除插入的记录:?

Sql代码??收藏代码
  1. DELETE?FROM?emp?WHERE?ename='临时';??
  2. ????????COMMIT;??


输出结果为:?

Sql代码??收藏代码
  1. 已删除5行。??
  2. ????????提交完成。??


说明:该练习使用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;??


输出结果为:?

Sql代码??收藏代码
  1. 4037913??
  2. 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;??


输出结果为:?

Sql代码??收藏代码
  1. 409114??
  2. ????????PL/SQL?过程已成功完成。???


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

黑色头发:http://heisetoufa.iteye.com/

  相关解决方案