`

[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

 
阅读更多

[推荐]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_comment
VARCHAR2(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_name
VARCHAR2(20);
v_salary
NUMBER(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_name
VARCHAR2(20);
v_hire_dateDATE;
v_bonus
NUMBER(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;

3.2CASE表达式

---------格式一---------
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_grade
char(1):=UPPER('&p_grade');
V_appraisal
VARCHAR2(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_raise
NUMBER(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;

3.3循环

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
x
NUMBER:=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_counter
NUMBER:=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_varray
ISVARRAY(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;

11While循环中嵌套loop循环

/*求100至110之间的素数*/
DECLARE
v_m
NUMBER:=101;
v_i
NUMBER;
v_n
NUMBER:=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/SQLGOTO语句是无条件跳转到指定的标号去的意思。语法如下:

GOTOlabel;
......
<<label>> /*标号是用<< >>括起来的标识符*/

注意,在以下地方使用是不合法的,编译时会出错误。

u跳转到非执行语句前面。

u跳转到子块中。

u跳转到循环语句中。

u跳转到条件语句中。

u从异常处理部分跳转到执行。

u从条件语句的一部分跳转到另一部分。

12:

DECLARE
V_counter
NUMBER:=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_i
NUMBER:=0;
v_s
NUMBER:=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_raise
NUMBER(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/
CSDNhttp://blog.csdn.net/chinahuyong

作者:EricHuDBC/SB/SWebServiceWCFPM
出处:http://www.cnblogs.com/huyong/

QQ80368704E-Mail:80368704@qq.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
更多文章请看[置顶]索引贴——(不断更新中)


分享到:
评论

相关推荐

    oracle pl/sql编程详细

    ORACLE PL/SQL编程详解之一: ................................................................................................................................. 3 PL/SQL 程序设计简介(千里之行,始于足下)...

    PL/SQL编程基础知识

    PL/SQL 编程基础知识详解,PL/SQL 包含过程化语句和SQL语句数据操作和查询语句被包含在PL/SQL代码的程序单元中(PL/SQL块),经过逻辑判断、循环等操作完成复杂的功能或者计算.。

    Oracle PL-SQL编程详解.pdf

    本⽂⽬录: 1. PL/SQL 程序设计简介 2. PL/SQL块结构和组成元素 3. PL/SQL流程控制语句 4. 把游标说透 5. 异常错误处理 6. 把过程与函数说透 7. 程序包的创建与应⽤ 8. 把触发器说透

    Oracle PL/SQL语言初级教程

    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 集合的...

    pl/sql 开发详解

    从Oracle6开始,Oracle公司在标准SQL的基础上发展了自己的PL/SQL语言,将变量、控制结构、过程和函数等结构化程序设计的要素引入了SQL语言中,这样就能够编制比较复杂的SQL程序了,利用PL/SQL语言编写的程序也称为...

    Oracle PL_SQL语言初级教程

    PL/SQL 是一种高性能的基于事务处理的语言,能运行在任何 ORACLE 环境中,支持所有数据处理命令。 通过使用 PL/SQL 程序单元处理 SQL 的数据定义和数据控制元素。 • Oracle PL/SQL语言基础(1) • Oracle PL/SQL语言...

    Oracle_PLSQL_编程语法详解

    第一章 PL/SQL程序设计简介 ...第三章 PL/SQL流程控制语句 第四章 游标的使用 第五章 异常错误处理 第六章 存储过程和函数 第七章 包的创建和应用 第八章 触发器 第九章 ORACLE提供的常用包

    OraclePL/SQL单行函数和组函数详解

    正在看的ORACLE教程是:OraclePL/SQL单行函数和组函数详解。 1 函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 2...

    Oracle中PL/SQL单行函数和组函数详解数据库开发技术

    在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类:23 单行函数45 组函数67 本文将讨论如何利用单行函数以及使用规则。89 SQL中的单行函数1011 SQL和PL/SQL中自带很多...

    Oracle的PL SQL笔记

    Oracle的PL SQL语句,例如:存储过程、函数、触发器等,都有代码详解,并将重点标出,便于阅读

    Oracle数据库使用及命名规则的详解

    本注释说明主要用于PL/SQL程序及其它SQL文件,其它可作参考;  2. SQLPLUS接受的注释有三种:  ―― 这儿是注释  /* 这儿是注释 */  REM 这儿是注释  3. 开始注释,类似JAVAK中的开始注释,主要...

    精通SQL 结构化查询语言详解

    《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...

    精通SQL--结构化查询语言详解

    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中如何找到未提交事务的SQL语句详解

    在Oracle数据库中,我们能否找到未提交事务(uncommit transactin)的SQL语句或其他相关信息呢? 关于这个问题,我们先来看看实验测试吧。实践出真知。 首先,我们在会话1(SID=63)中构造一个未提交的事务,如下所:...

    Oracle基本PLSQL的使用实例详解

    PL/SQL 块是在 SQL 语言之上发展起来的一种应用,可以集中的处理各种复杂的 SQL 操 作。 组成: DECLARE: 声明部分 BEGIN 编写主题 EXCEPTION 捕获异常 END; 1.一个简单的PL/SQL块 DECLARE i number; BEGIN...

    Oracle_Database_11g完全参考手册.part11

    《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,...

    非常全的oracle文档

    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....

    ORACLE数据库查看执行计划的方法

    一、什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。 二、如何查看执行计划 1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。 很多人以为PL/SQL的执行计划只能...

Global site tag (gtag.js) - Google Analytics