[推荐]ORACLEPL/SQL编程详解之三:
PL/SQL流程控制语句(不给规则,不成方圆)
——通过知识共享树立个人品牌。
继上五篇:
[顶]ORACLEPL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)
[推荐]ORACLEPL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
[推荐]ORACLEPL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
ORACLEPL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
ORACLEPL/SQL编程之八:把触发器说透
接下来再次介绍PL/SQL的基础篇:PL/SQL流程控制语句,还望大家继续支持与推荐~!
本篇主要内容如下:
3.1条件语句
3.2CASE表达式
3.3循环
3.4标号和GOTO
3.5NULL语句
介绍PL/SQL的流程控制语句,包括如下三类:
l控制语句:IF语句
l循环语句:LOOP语句,EXIT语句
l顺序语句:GOTO语句,NULL语句
<!--EndFragment-->3.1条件语句
IF<布尔表达式>THEN
PL/SQL和SQL语句
ENDIF;
-----------------------
IF<布尔表达式>THEN
PL/SQL和SQL语句
ELSE
其它语句
ENDIF;
-----------------------
IF<布尔表达式>THEN
PL/SQL和SQL语句
ELSIF<其它布尔表达式>THEN
其它语句
ELSIF<其它布尔表达式>THEN
其它语句
ELSE
其它语句
ENDIF;
提示:ELSIF不能写成ELSEIF
例1:
DECLARE
v_empnoemployees.employee_id%TYPE:=&empno;
V_salaryemployees.salary%TYPE;
V_commentVARCHAR2(35);
BEGIN
SELECTsalaryINTOv_salaryFROMemployees
WHEREemployee_id=v_empno;
IFv_salary<1500THEN
V_comment:='太少了,加点吧~!';
ELSIFv_salary<3000THEN
V_comment:='多了点,少点吧~!';
ELSE
V_comment:='没有薪水~!';
ENDIF;
DBMS_OUTPUT.PUT_LINE(V_comment);
exception
whenno_data_foundthen
DBMS_OUTPUT.PUT_LINE('没有数据~!');
whenothersthen
DBMS_OUTPUT.PUT_LINE(sqlcode||'---'||sqlerrm);
END;
例2:
DECLARE
v_first_nameVARCHAR2(20);
v_salaryNUMBER(7,2);
BEGIN
SELECTfirst_name,salaryINTOv_first_name,v_salaryFROMemployees
WHEREemployee_id=&emp_id;
DBMS_OUTPUT.PUT_LINE(v_first_name||'雇员的工资是'||v_salary);
IFv_salary<10000THEN
DBMS_OUTPUT.PUT_LINE('工资低于10000');
ELSE
IF10000<=v_salaryANDv_salary<20000THEN
DBMS_OUTPUT.PUT_LINE('工资在10000到20000之间');
ELSE
DBMS_OUTPUT.PUT_LINE('工资高于20000');
ENDIF;
ENDIF;
END;
例3:
DECLARE
v_first_nameVARCHAR2(20);
v_hire_dateDATE;
v_bonusNUMBER(6,2);
BEGIN
SELECTfirst_name,hire_dateINTOv_first_name,v_hire_dateFROMemployees
WHEREemployee_id=&emp_id;
IFv_hire_date>TO_DATE('01-1月-90')THEN
v_bonus:=800;
ELSIFv_hire_date>TO_DATE('01-1月-88')THEN
v_bonus:=1600;
ELSE
v_bonus:=2400;
ENDIF;
DBMS_OUTPUT.PUT_LINE(v_first_name||'雇员的雇佣日期是'||v_hire_date
||'、奖金是'||v_bonus);
END;
---------格式一---------
CASE条件表达式
WHEN条件表达式结果1THEN
语句段1
WHEN条件表达式结果2THEN
语句段2
......
WHEN条件表达式结果nTHEN
语句段n
[ELSE条件表达式结果]
END;
---------格式二---------
CASE
WHEN条件表达式1THEN
语句段1
WHEN条件表达式2THEN
语句段2
......
WHEN条件表达式nTHEN
语句段n
[ELSE语句段]
END;
例4:
DECLARE
V_gradechar(1):=UPPER('&p_grade');
V_appraisalVARCHAR2(20);
BEGIN
V_appraisal:=
CASEv_grade
WHEN'A'THEN'Excellent'
WHEN'B'THEN'VeryGood'
WHEN'C'THEN'Good'
ELSE'Nosuchgrade'
END;
DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||'Appraisal:'||v_appraisal);
END;
例5:
DECLARE
v_first_nameemployees.first_name%TYPE;
v_job_idemployees.job_id%TYPE;
v_salaryemployees.salary%TYPE;
v_sal_raiseNUMBER(3,2);
BEGIN
SELECTfirst_name,job_id,salaryINTO
v_first_name,v_job_id,v_salary
FROMemployeesWHEREemployee_id=&emp_id;
CASE
WHENv_job_id='PU_CLERK'THEN
IFv_salary<3000THENv_sal_raise:=.08;
ELSEv_sal_raise:=.07;
ENDIF;
WHENv_job_id='SH_CLERK'THEN
IFv_salary<4000THENv_sal_raise:=.06;
ELSEv_sal_raise:=.05;
ENDIF;
WHENv_job_id='ST_CLERK'THEN
IFv_salary<3500THENv_sal_raise:=.04;
ELSEv_sal_raise:=.03;
ENDIF;
ELSE
DBMS_OUTPUT.PUT_LINE('该岗位不涨工资:'||v_job_id);
ENDCASE;
DBMS_OUTPUT.PUT_LINE(v_first_name||'的岗位是'||v_job_id
||'、的工资是'||v_salary
||'、工资涨幅是'||v_sal_raise);
END;
1.简单循环
LOOP
要执行的语句;
EXITWHEN<条件语句>--条件满足,退出循环语句
ENDLOOP;
例6.
DECLARE
intNUMBER(2):=0;
BEGIN
LOOP
int:=int+1;
DBMS_OUTPUT.PUT_LINE('int的当前值为:'||int);
EXITWHENint=10;
ENDLOOP;
END;
2.WHILE循环
WHILE<布尔表达式>LOOP
要执行的语句;
ENDLOOP;
例7.
DECLARE
xNUMBER:=1;
BEGIN
WHILEx<=10LOOP
DBMS_OUTPUT.PUT_LINE('X的当前值为:'||x);
x:=x+1;
ENDLOOP;
END;
3.数字式循环
[<<循环标签>>]
FOR循环计数器IN[REVERSE]下限..上限LOOP
要执行的语句;
ENDLOOP[循环标签];
每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在INREVERSE后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环。
例8.
BEGIN
FORintin1..10LOOP
DBMS_OUTPUT.PUT_LINE('int的当前值为:'||int);
ENDLOOP;
END;
例9.
CREATETABLEtemp_table(num_colNUMBER);
DECLARE
V_counterNUMBER:=10;
BEGIN
INSERTINTOtemp_table(num_col)VALUES(v_counter);
FORv_counterIN20..25LOOP
INSERTINTOtemp_table(num_col)VALUES(v_counter);
ENDLOOP;
INSERTINTOtemp_table(num_col)VALUES(v_counter);
FORv_counterINREVERSE20..25LOOP
INSERTINTOtemp_table(num_col)VALUES(v_counter);
ENDLOOP;
END;
DROPTABLEtemp_table;
例10:
DECLARE
TYPEjobids_varrayISVARRAY(12)OFVARCHAR2(10);--定义一个VARRAY数据类型
v_jobidsJOBIDS_VARRAY;--声明一个具有JOBIDS_VARRAY数据类型的变量
v_howmanyNUMBER;--声明一个变量来保存雇员的数量
BEGIN
--用某些job_id值初始化数组
v_jobids:=jobids_varray('FI_ACCOUNT','FI_MGR','ST_CLERK','ST_MAN');
--用FOR...LOOP...ENDLOOP循环使用每个数组成员的值
FORiINv_jobids.FIRST..v_jobids.LASTLOOP
--针对数组中的每个岗位,决定该岗位的雇员的数量
SELECTcount(*)INTOv_howmanyFROMemployeesWHEREjob_id=v_jobids(i);
DBMS_OUTPUT.PUT_LINE('岗位'||v_jobids(i)||
'总共有'||TO_CHAR(v_howmany)||'个雇员');
ENDLOOP;
END;
例11在While循环中嵌套loop循环
/*求100至110之间的素数*/
DECLARE
v_mNUMBER:=101;
v_iNUMBER;
v_nNUMBER:=0;
BEGIN
WHILEv_m<110LOOP
v_i:=2;
LOOP
IFmod(v_m,v_i)=0THEN
v_i:=0;
EXIT;
ENDIF;
v_i:=v_i+1;
EXITWHENv_i>v_m-1;
ENDLOOP;
IFv_i>0THEN
v_n:=v_n+1;
DBMS_OUTPUT.PUT_LINE('第'||v_n||'个素数是'||v_m);
ENDIF;
v_m:=v_m+2;
ENDLOOP;
END;
3.4标号和GOTO
PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:
GOTOlabel;
......
<<label>> /*标号是用<< >>括起来的标识符*/
注意,在以下地方使用是不合法的,编译时会出错误。
u跳转到非执行语句前面。
u跳转到子块中。
u跳转到循环语句中。
u跳转到条件语句中。
u从异常处理部分跳转到执行。
u从条件语句的一部分跳转到另一部分。
例12:
DECLARE
V_counterNUMBER:=1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);
V_counter:=v_counter+1;
IFv_counter>10THEN
GOTOlabelOffLOOP;
ENDIF;
ENDLOOP;
<<labelOffLOOP>>
DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);
END;
例13:
DECLARE
v_iNUMBER:=0;
v_sNUMBER:=0;
BEGIN
<<label_1>>
v_i:=v_i+1;
IFv_i<=1000THEN
v_s:=v_s+v_i;
GOTOlabel_1;
ENDIF;
DBMS_OUTPUT.PUT_LINE(v_s);
END;
3.5NULL语句
在PL/SQL程序中,NULL语句是一个可执行语句,可以用null语句来说明“不用做任何事情”的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:
例14:
DECLARE
...
BEGIN
...
IFv_numISNULLTHEN
GOTOlabelPrint;
ENDIF;
…
<<labelPrint>>
NULL;--不需要处理任何数据。
END;
例15:
DECLARE
v_emp_idemployees.employee_id%TYPE;
v_first_nameemployees.first_name%TYPE;
v_salaryemployees.salary%TYPE;
v_sal_raiseNUMBER(3,2);
BEGIN
v_emp_id:=&emp_id;
SELECTfirst_name,salaryINTOv_first_name,v_salary
FROMemployeesWHEREemployee_id=v_emp_id;
IFv_salary<=3000THEN
v_sal_raise:=.10;
DBMS_OUTPUT.PUT_LINE(v_first_name||'的工资是'||v_salary
||'、工资涨幅是'||v_sal_raise);
ELSE
NULL;
ENDIF;
END;
©2011EricHu
原创作品,转贴请注明作者和出处,留此信息。
------------------------------------------------
cnBlobs:http://www.cnblogs.com/huyong/
CSDN:http://blog.csdn.net/chinahuyong
作者:EricHu(DB、C/S、B/S、WebService、WCF、PM等)
出处:http://www.cnblogs.com/huyong/
QQ:80368704E-Mail:80368704@qq.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
更多文章请看[置顶]索引贴——(不断更新中)
分享到:
相关推荐
ORACLE PL/SQL编程详解之一: ................................................................................................................................. 3 PL/SQL 程序设计简介(千里之行,始于足下)...
PL/SQL 编程基础知识详解,PL/SQL 包含过程化语句和SQL语句数据操作和查询语句被包含在PL/SQL代码的程序单元中(PL/SQL块),经过逻辑判断、循环等操作完成复杂的功能或者计算.。
本⽂⽬录: 1. PL/SQL 程序设计简介 2. PL/SQL块结构和组成元素 3. PL/SQL流程控制语句 4. 把游标说透 5. 异常错误处理 6. 把过程与函数说透 7. 程序包的创建与应⽤ 8. 把触发器说透
Oracle PL/SQL语言初级教程 1 目录 1 1.PL/SQL语言基础 3 过程 5 包(package) 6 变量和常量 6 执行部分 10 控制结构 12 小结 17 2.PL/SQL的复合数据类型 17 使用记录 19 PL/SQL集合 23 嵌套表 24 使用集合 25 集合的...
从Oracle6开始,Oracle公司在标准SQL的基础上发展了自己的PL/SQL语言,将变量、控制结构、过程和函数等结构化程序设计的要素引入了SQL语言中,这样就能够编制比较复杂的SQL程序了,利用PL/SQL语言编写的程序也称为...
PL/SQL 是一种高性能的基于事务处理的语言,能运行在任何 ORACLE 环境中,支持所有数据处理命令。 通过使用 PL/SQL 程序单元处理 SQL 的数据定义和数据控制元素。 • Oracle PL/SQL语言基础(1) • Oracle PL/SQL语言...
第一章 PL/SQL程序设计简介 ...第三章 PL/SQL流程控制语句 第四章 游标的使用 第五章 异常错误处理 第六章 存储过程和函数 第七章 包的创建和应用 第八章 触发器 第九章 ORACLE提供的常用包
正在看的ORACLE教程是:OraclePL/SQL单行函数和组函数详解。 1 函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 2...
在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类:23 单行函数45 组函数67 本文将讨论如何利用单行函数以及使用规则。89 SQL中的单行函数1011 SQL和PL/SQL中自带很多...
Oracle的PL SQL语句,例如:存储过程、函数、触发器等,都有代码详解,并将重点标出,便于阅读
本注释说明主要用于PL/SQL程序及其它SQL文件,其它可作参考; 2. SQLPLUS接受的注释有三种: ―― 这儿是注释 /* 这儿是注释 */ REM 这儿是注释 3. 开始注释,类似JAVAK中的开始注释,主要...
《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...
1.5.3 sql语句的结构 13 .1.5.4 sql的优点 13 1.5.5 sql的执行 14 1.6 sql环境 15 1.6.1 环境 15 1.6.2 sql的层次结构 15 1.6.3 客户程序和服务程序系统 17 1.6.4 sql环境中对象的命名规则 18 第2章 主要的...
在Oracle数据库中,我们能否找到未提交事务(uncommit transactin)的SQL语句或其他相关信息呢? 关于这个问题,我们先来看看实验测试吧。实践出真知。 首先,我们在会话1(SID=63)中构造一个未提交的事务,如下所:...
PL/SQL 块是在 SQL 语言之上发展起来的一种应用,可以集中的处理各种复杂的 SQL 操 作。 组成: DECLARE: 声明部分 BEGIN 编写主题 EXCEPTION 捕获异常 END; 1.一个简单的PL/SQL块 DECLARE i number; BEGIN...
《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,...
24.2. PL/SQL代码编写规则 173 24.3. PL/SQL程序块 175 24.4. 常量和数据类型 177 24.5. 变量 179 24.6. 运算符和注释 181 24.7. IF条件语句 182 24.8. CASE语句 184 24.9. 循环语句 186 24.10. 复合变量 190 24.11....
一、什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。 二、如何查看执行计划 1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。 很多人以为PL/SQL的执行计划只能...