`

ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句

阅读更多

 

这里转自胡勇先生的博客,感谢他的分享精神... 

 

本篇主要内容如下:

3.1  条件语句

3.2  CASE 表达式

3.3  循环

3.4  标号和GOTO

3.5  NULL 语句

 


 

 

 

介绍PL/SQL的流程控制语句包括如下三类:

 

控制语句: IF 语句

循环语句: LOOP语句, EXIT语句

顺序语句: GOTO语句, NULL语句

 

3.1  条件语句

 

复制代码
IF <布尔表达式> THEN
  PL
/SQL 和 SQL语句
END IF;
-----------------------
IF <布尔表达式> THEN
  PL
/SQL 和 SQL语句
ELSE
  其它语句
END IF;
-----------------------
IF <布尔表达式> THEN
  PL
/SQL 和 SQL语句
ELSIF 
< 其它布尔表达式> THEN
  其它语句
ELSIF 
< 其它布尔表达式> THEN
  其它语句
ELSE
  其它语句
END IF;
复制代码

 

 

提示: ELSIF 不能写成 ELSEIF

 

1:

 

复制代码
DECLARE
    v_empno  employees.employee_id
%TYPE :=&empno;
    V_salary employees.salary
%TYPE;
    V_comment 
VARCHAR2(35);
BEGIN
   
SELECT salary INTO v_salary FROM employees 
   
WHERE employee_id = v_empno;
   
IF v_salary < 1500 THEN
       V_comment:
= '太少了,加点吧~!';
   ELSIF v_salary 
<3000 THEN
      V_comment:
= '多了点,少点吧~!';
   
ELSE
      V_comment:
= '没有薪水~!';
   
END IF;
   DBMS_OUTPUT.PUT_LINE(V_comment);
   exception
     
when no_data_found then
        DBMS_OUTPUT.PUT_LINE(
'没有数据~!');
     
when others then
        DBMS_OUTPUT.PUT_LINE(sqlcode 
|| '---' || sqlerrm);        
END;
复制代码

 

 

2:

 

复制代码
DECLARE
   v_first_name  
VARCHAR2(20);
   v_salary 
NUMBER(7,2);
BEGIN
   
SELECT first_name, salary INTO v_first_name, v_salary FROM employees
   
WHERE employee_id = &emp_id;
   DBMS_OUTPUT.PUT_LINE(v_first_name
||'雇员的工资是'||v_salary);
   
IF v_salary < 10000 THEN
      DBMS_OUTPUT.PUT_LINE(
'工资低于10000');
   
ELSE
      
IF 10000 <= v_salary AND v_salary < 20000 THEN
         DBMS_OUTPUT.PUT_LINE(
'工资在10000到20000之间');
      
ELSE
         DBMS_OUTPUT.PUT_LINE(
'工资高于20000');
      
END IF;
   
END IF;
END;
复制代码

 

 

3:

复制代码
DECLARE
   v_first_name  
VARCHAR2(20);
   v_hire_date DATE;
   v_bonus 
NUMBER(6,2);
BEGIN
   
SELECT first_name, hire_date INTO v_first_name, v_hire_date FROM employees
   
WHERE employee_id = &emp_id;
   
IF v_hire_date > TO_DATE('01-1月-90'THEN
      v_bonus :
= 800;
   ELSIF v_hire_date 
> TO_DATE('01-1月-88'THEN
      v_bonus :
= 1600;
   
ELSE
      v_bonus :
= 2400;
   
END IF;
   DBMS_OUTPUT.PUT_LINE(v_first_name
||'雇员的雇佣日期是'||v_hire_date
                                    
||'、奖金是'||v_bonus);
END;
复制代码

 

3.2  CASE 表达式

 

复制代码
---------格式一---------
CASE 条件表达式
  
WHEN 条件表达式结果1 THEN 
     语句段1
  
WHEN 条件表达式结果2 THEN
     语句段2
  ......
  
WHEN 条件表达式结果n THEN
     语句段n
  
[ELSE 条件表达式结果]
END;
---------格式二---------
CASE 
  
WHEN 条件表达式1 THEN
     语句段1
  
WHEN 条件表达式2 THEN
     语句段2
  ......
  
WHEN 条件表达式n THEN 
     语句段n
  
[ELSE 语句段]
END;
复制代码

 

 

4:

 

复制代码
DECLARE
  V_grade 
char(1) := UPPER('&p_grade');
  V_appraisal 
VARCHAR2(20);
BEGIN
  V_appraisal :
=
  
CASE v_grade
    
WHEN 'A' THEN 'Excellent'
    
WHEN 'B' THEN 'Very Good'
    
WHEN 'C' THEN 'Good'
    
ELSE 'No such grade'
  
END;
  DBMS_OUTPUT.PUT_LINE(
'Grade:'||v_grade||'  Appraisal: '|| v_appraisal);
END;
复制代码

 

 

5:

 

复制代码
DECLARE
   v_first_name employees.first_name
%TYPE;
   v_job_id employees.job_id
%TYPE;
   v_salary employees.salary
%TYPE;
   v_sal_raise 
NUMBER(3,2);
BEGIN
   
SELECT first_name,   job_id,   salary INTO
          v_first_name, v_job_id, v_salary
   
FROM employees WHERE employee_id = &emp_id;
   
CASE
      
WHEN v_job_id = 'PU_CLERK' THEN
         
IF v_salary < 3000 THEN v_sal_raise := .08;
         
ELSE v_sal_raise := .07;
         
END IF;
      
WHEN v_job_id = 'SH_CLERK' THEN
         
IF v_salary < 4000 THEN v_sal_raise := .06;
         
ELSE v_sal_raise := .05;
         
END IF;
      
WHEN v_job_id = 'ST_CLERK' THEN
         
IF v_salary < 3500 THEN v_sal_raise := .04;
         
ELSE v_sal_raise := .03;
         
END IF;
      
ELSE
         DBMS_OUTPUT.PUT_LINE(
'该岗位不涨工资: '||v_job_id);
   
END CASE;
   DBMS_OUTPUT.PUT_LINE(v_first_name
||'的岗位是'||v_job_id
                                    
||'、的工资是'||v_salary
                                    
||'、工资涨幅是'||v_sal_raise);
END;
复制代码

 

 

 

 

3.3  循环

 1.  简单循环

 

  LOOP
      要执行的语句;
      
EXIT WHEN <条件语句> --条件满足,退出循环语句
  END LOOP;

 

 

 

例 6.

 

复制代码
DECLARE
    
int NUMBER(2) :=0;
BEGIN
   LOOP
      
int := int + 1;
      DBMS_OUTPUT.PUT_LINE(
'int 的当前值为:'||int);
      
EXIT WHEN int =10;
   
END LOOP;
END;
复制代码

 

 

2.  WHILE 循环

WHILE <布尔表达式> LOOP
    要执行的语句;
END LOOP;

 

 

 

 

7.

 

 

复制代码
DECLARE 
  x 
NUMBER :=1;
BEGIN
   
WHILE x<=10 LOOP
      DBMS_OUTPUT.PUT_LINE(
'X的当前值为:'||x);
       x:
= x+1;
   
END LOOP;
END;
复制代码

 

 

3.  数字式循环

 

 

[<<循环标签>>]
FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP
  要执行的语句;
END LOOP [循环标签];

 

 

每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环。

 

8.

 

 

BEGIN
   
FOR int  in 1..10 LOOP
       DBMS_OUTPUT.PUT_LINE(
'int 的当前值为: '||int);
   
END LOOP;
END;

 

 

例 9.

 

复制代码
CREATE TABLE temp_table(num_col NUMBER);

DECLARE
    V_counter 
NUMBER := 10;
BEGIN
   
INSERT INTO temp_table(num_col) VALUES (v_counter );
   
FOR v_counter IN 20 .. 25 LOOP
      
INSERT INTO temp_table (num_col ) VALUES ( v_counter );
   
END LOOP;
   
INSERT INTO temp_table(num_col) VALUES (v_counter );
   
FOR v_counter IN REVERSE 20 .. 25 LOOP
      
INSERT INTO temp_table (num_col ) VALUES ( v_counter );
   
END LOOP;
END ;

DROP TABLE temp_table;
复制代码

 

 

10:

 

复制代码
DECLARE
   TYPE jobids_varray 
IS VARRAY(12OF VARCHAR2(10); --定义一个VARRAY数据类型
   v_jobids JOBIDS_VARRAY; --声明一个具有JOBIDS_VARRAY数据类型的变量
   v_howmany NUMBER--声明一个变量来保存雇员的数量

BEGIN
   
--用某些job_id值初始化数组
   v_jobids := jobids_varray('FI_ACCOUNT''FI_MGR''ST_CLERK''ST_MAN');

   
--用FOR...LOOP...END LOOP循环使用每个数组成员的值
   FOR i IN v_jobids.FIRST..v_jobids.LAST LOOP

   
--针对数组中的每个岗位,决定该岗位的雇员的数量
      SELECT count(*INTO v_howmany FROM employees WHERE job_id = v_jobids(i);
      DBMS_OUTPUT.PUT_LINE ( 
'岗位'||v_jobids(i)||
                       
'总共有'|| TO_CHAR(v_howmany) || '个雇员');
   
END LOOP;
END;
复制代码

 

 

11 While循环中嵌套loop循环

复制代码
/*求100至110之间的素数*/
DECLARE
   v_m 
NUMBER := 101;
   v_i 
NUMBER;
   v_n 
NUMBER := 0;
BEGIN
   
WHILE v_m < 110 LOOP
      v_i :
= 2;
      LOOP
         
IF mod(v_m, v_i) = 0 THEN
            v_i :
= 0;
            
EXIT;
         
END IF;
    
         v_i :
= v_i + 1;
         
EXIT WHEN v_i > v_m - 1
      
END LOOP;
      
      
IF v_i > 0 THEN
         v_n :
= v_n + 1;
         DBMS_OUTPUT.PUT_LINE(
''|| v_n || '个素数是' || v_m);
      
END IF;

      v_m :
= v_m + 2;
   
END LOOP;
END;
复制代码

 

3.4  标号和GOTO 

PL/SQLGOTO语句是无条件跳转到指定的标号去的意思。语法如下:

 

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

 

 

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

跳转到非执行语句前面。

跳转到子块中。

跳转到循环语句中。

跳转到条件语句中。

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

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

 

12:

 

复制代码
DECLARE
   V_counter 
NUMBER := 1;
BEGIN
   LOOP 
     DBMS_OUTPUT.PUT_LINE(
'V_counter的当前值为:'||V_counter);
     V_counter :
= v_counter + 1;
   
IF v_counter > 10 THEN
       
GOTO labelOffLOOP;
   
END IF;
   
END LOOP;
   
<<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;
   
IF v_i <= 1000 THEN
      v_s :
= v_s + v_i;
      
GOTO label_1;
   
END IF;
   DBMS_OUTPUT.PUT_LINE(v_s);
END;
复制代码

 

3.5  NULL 语句 

PL/SQL 程序中,NULL语句是一个可执行语句,可以用 null 语句来说明不用做任何事情的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:

14:

 

复制代码
DECLARE
    ...
BEGIN
    ...
    
IF v_num IS NULL THEN
    
GOTO labelPrint;
    
END IF;
  …
  
<<labelPrint>>
  
NULL--不需要处理任何数据。
END;
复制代码

 

 

15:

 

复制代码
DECLARE
   v_emp_id employees.employee_id
%TYPE;
   v_first_name employees.first_name
%TYPE;
   v_salary employees.salary
%TYPE;
   v_sal_raise 
NUMBER(3,2);
BEGIN
   v_emp_id :
= &emp_id;
   
SELECT first_name, salary INTO v_first_name, v_salary
   
FROM employees WHERE employee_id = v_emp_id;
   
IF v_salary <= 3000 THEN
      v_sal_raise :
= .10;
      DBMS_OUTPUT.PUT_LINE(v_first_name
||'的工资是'||v_salary
                                       
||'、工资涨幅是'||v_sal_raise);
   
ELSE
      
NULL;
   
END IF;
END;
复制代码

 

 

 

 

© 2011  EricHu

原创作品,转贴请注明作者和出处,留此信息。

 

------------------------------------------------

cnBlobs:http://www.cnblogs.com/huyong/
CSDNhttp://blog.csdn.net/chinahuyong 

分享到:
评论

相关推荐

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

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

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

    Oracle_PLSQL_编程语法详解

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

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

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

    Oracle的PL SQL笔记

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

    ORACLE中如何找到未提交事务的SQL语句详解

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

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

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

    Oracle基本PLSQL的使用实例详解

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

    精通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数据库查看执行计划的方法

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

    PLSQL Developer238页中文版使用手册

    7.1输入SQL语句和命令 7.2开发命令文件 7.3支持命令 8创建与修改非PL/SQL对象(因篇幅限制下面2级目录省略) 9图标 10报告 11图形 12工程 13任务项目 14窗口、数据库会话和事务 15浏览对象 16首选项 17工具 18...

    Oracle_Database_11g完全参考手册.part11

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

    ORACLE函数大全汇总详解(20100915补充修订版)

    ORACLE函数大全汇总详解(20100915补充修订版) 函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句

Global site tag (gtag.js) - Google Analytics