8.PL_SQL——PL_SQL中的条件控制语句

和大多数程序语言一样,PL/SQL也有控制语句执行的结构,主要包括:

1、顺序结构:程序从上往下执行逐条语句,就是顺序结构;

2、分支条件判断:分支条件判断主要是指的IF语句和CASE语句。

3、循环语句:循环结构主要指的是REPEAT、LOOP和DO WHILE语句。

本章节主要讲解条件判断语句的用法。

一、 IF 语句的用法

IF 语句的基本格式为:

IF conditionTHEN

                                statements

                [ ELSIF conditionTHEN 

-- 注意,这里的ELSIF中间没有E,ELSIF可以出现任意次

statements;]

                [ ELSE

                 statements

                ]

                END IF;

IF 后面的判断条件可以是布尔值,常量或表达式,判断结果为TRUE, FALSE或NULL,其中NULL这种情况是PL/SQL中特有的,其他编程语言并不常见;

如果IF后的条件判断结果为TRUE,就执行THEN后面的语句;如果结果为FALSE和NULL,则不执行THEN后面的结果,而执行ELSE后面的语句。

下面看一个简单的例子:

SQL> edit

DECLARE
        v_myage number :=31;
BEGIN
        IF v_myage < 11
        THEN
           DBMS_OUTPUT.PUT_LINE(‘ I am a child‘);
        ELSE
           DBMS_OUTPUT.PUT_LINE( ‘ I am not achild! ‘);
                 -- 由于IF后的条件判断结果为FALSE,所以会执行这条语句
        END IF;
END;
/

SQL> /

I am not a child!
PL/SQL procedure successfullycompleted.

现在为上述例子多添加几条分支进行条件判断:

SQL> edit

BEGIN
        IF v_myage < 11 THEN
                DBMS_OUTPUT.PUT_LINE(‘ I am achild ‘);
                ELSIF v_myage < 20 THEN
                     DBMS_OUTPUT.PUT_LINE( ‘Iam young ‘);
                ELSIF v_myage < 30 THEN
                     DBMS_OUTPUT.PUT_LINE( ‘Iam in my twenties‘);
                ELSIF v_myage < 40 THEN
                     DBMS_OUTPUT.PUT_LINE( ‘I am in mythirties‘);
                -- 由于31大于11,20,30,而小于40,所以执行这条语句
                ELSE
                     DBMS_OUTPUT.PUT_LINE( ‘Iam always young ‘);
        END IF;
END;
/

SQL> /

I am in my thirties
PL/SQL procedure successfullycompleted.

如果IF条件判断的结果为NULL,则不会执行THEN后面的语句。

SQL> edit

DECLARE
        v_myage NUMBER;
BEGIN
       -- IF v_myage IS NULL
                --这里的结果时TRUE,因为判断是变量v_myage是否为NULL值,是就为TRUE,不是就为FALSE
        IF v_myage < 11 THEN
                -- 如果判断的条件为NULL值,则结果为NULL
        THEN
           DBMS_OUTPUT.PUT_LINE(‘ I am a child‘);
        ELSE
           DBMS_OUTPUT.PUT_LINE( ‘ I am not achild! ‘);
        END IF;
END;
/

SQL> /

I am not a child
PL/SQL procedure successfullycompleted.

IF 语句的条件还可以使用AND,OR,NOT等逻辑符进行组合。

IF条件判断语句中需要注意一些细节:

a. IF 和 END IF必须配对出现;

                b. END IF中间有空格;

                c. ELSIF中间没有E

                d. 在END IF后面有分号“;

二、 CASE的用法

CASE实际上IF语句的变体,当IF语句有大量类似的ELSIF判断条件时,就可以使用CASE来进行简化。CASE的用法可以分为两种,一种是CASE表达式,另一种是CASE语句。

(1)CASE表达式

CASE 表达式的基本格式为:

CASE selector

                                                WHENexpression1 THEN result1

                                                WHENexpression2 THEN result2

                                                ...

                                                WHENexpressionN THEN resultN

                                                [ELSEresultN+1]

                                END;

其中selector选择值如果等于expression1的值,就执行result1,如果等于expression2,就执行result2...以此类推,如果没有expression的值能与之匹配的,就执行resultN+1。

CASE表达式可以分为simple CASE和Searched CASE,其中simple CASE是指CASE后面会跟一个选择值,然后将条件表达式的结果和这个选择值进行比较,如下述这个例子:

SQL> edit           

  SET VERIFY OFF
DECLARE
        v_grade CHAR(1) := UPPER(‘&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;
-- 从CASE到END这一部分是simple CASE,其运行结果作为一个值赋给v_appraisal这个变量。                               
        DBMS_OUTPUT.PUT_LINE (‘Grade: ‘ ||v_grade || ‘ Appraisal ‘ || v_appraisal);
END;

SQL>  /

Enter value for grade: a
Grade: A Appraisal Excellent
PL/SQL procedure successfullycompleted.

 

SQL> /

Enter value for grade: s
Grade: S Appraisal No suchgrade
PL/SQL procedure successfullycompleted.

Searched CASE 中CASE后面没有选择值selector,而是直接判断关键字WHEN后面表达式的布尔值,如下面这个例子:

SQL> edit

DECLARE
        v_grade CHAR(1) := UPPER(‘&grade‘);
        v_appraisal VARCHAR2(20);
BEGIN
        v_appraisal := CASE
                -- 这里的CASE没有选择值了
                WHEN v_grade = ‘A‘ THEN‘Excellent‘
                -- 直接在条件判断部分完成布尔值的返回
                WHEN v_grade IN (‘B‘,‘C‘) THEN‘Good‘
                ELSE ‘No such grade‘
        END;
        DBMS_OUTPUT.PUT_LINE (‘Grade: ‘ ||v_grade || ‘ Appraisal ‘ ||v_appraisal);
END;
/

SQL>/

Enter value for grade: A
Grade: A   Appraisal Excellent
PL/SQL procedure successfullycompleted.

SQL> /

Enter value for grade: o
Grade: O  Appraisal No such grade
PL/SQL procedure successfullycompleted.

SQL> /

Enter value for grade: b
Grade: B  Appraisal Good
PL/SQL procedure successfullycompleted.

(2)CASE语句

CASE语句就是一条条独立的语句,它不能将运行结果再赋值给其他的变量了。

如下面这个例子:

SQL> edit

DECLARE
        v_deptid NUMBER;
        v_deptname VARCHAR2(20);
        V_emps NUMBER;
        v_mngid NUMBER:= 108;
BEGIN
        CASE v_mngid
            WHEN 108 THEN
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 108;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
            --CASE语句不再作为一个整体将运行结果赋值给其他变量了                                     
            WHEN 200 THEN
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 200;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
           ELSE
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 100;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
        END CASE;
            --CASE语句中必须有END CASE,如果是CASE表达式就不需要END CASE。
 
        DBMS_OUTPUT.PUT_LINE(‘You are workingin the ‘ || v_deptname || ‘ department. There are ‘ ||v_emps || ‘employees inthis department‘);
END;
/

SQL> /

You are working in theFinance department. There are 6 employees in this
department
PL/SQL procedure successfullycompleted.

CASE语句也分为SimpleCASE语句和Searched CASE语句。他们之间的区别和CASE表达式一样。上述例子属于SimpleCASE的用法,如果要使用Searched CASE语句,可以写成如下形式:

SQL> edit

DECLARE
        v_deptid NUMBER;
        v_deptname VARCHAR2(20);
        V_emps NUMBER;
        v_mngid NUMBER:= 100;
BEGIN
        CASE
            WHEN v_mngid = 108 THEN
                --v_mngid不作为选择值,而是直接在WHEN后面进行判断
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 108;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
                                               
            WHEN v_mngid = 200 THEN
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 200;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
           ELSE
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 100;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
        END CASE;
        
        DBMS_OUTPUT.PUT_LINE(‘You are workingin the ‘ || v_deptname || ‘ department. There are ‘ ||v_emps || ‘employees inthis department‘);
END;
/

SQL> /

You are working in theExecutive department. There are 3 employees in this
department
PL/SQL procedure successfullycompleted.
时间: 2024-10-10 11:15:09

8.PL_SQL——PL_SQL中的条件控制语句的相关文章

7.PL_SQL——在PL_SQL程序中内嵌查询语句、DML语句和事物处理语句

在PL/SQL中可以使用的SQL语句主要有以下几类: SELECT 查询语句,DML语句,Transaction 事物处理语句,本文将对这几类语句在PL/SQL中的用法逐一介绍. 一.查询语句-SELECT SELECT 语句用来查询一条或多条语句.虽然SELECT 语句也属于DML语句,但SELECT是只读的,所以单独列出. 在PL/SQL中使用SELECT 语句的格式如下:   SELECT select_list INTO {variable_name[,variable_name]...

SQL SERVER中的流程控制语句

流程控制语句 是指用来控制程序执行和流程分至点额命令,一般指的是逻辑计算部分的控制. 1.Begin End语句 封装了多个T-SQL语句组合,将他们组成一个单元来处理.一般在条件查询或者循环等控制流程语句中,要查询满足特定条件的操作时会用到.Begin--end可以嵌套使用. 语法如下: begin --<sql语句或程序块> end 例子 begin --<sql语句或程序块> select * from StudentInfo update StudentInfo set m

Python条件控制语句与循环控制语句(四)

程序语言的条件控制语句与循环控制语句都一样,都是if与while还有for等. Python的条件语句是通过一条或多条语句的执行结果(True或false)来决定执行的代码块. If语句一般格式为: If condition_1 : statement block_1 elif condition_2  : Statement block_2 else condition_3 : Statement block_3 如果condition_1条件成立,则执行 statement block_1,

Python条件控制语句

条件控制语句 if语句 if条件加表达式 if-else语句 if-elif-else语句 if 表达式1: 语句1 elif 表达式2: 语句2 elif 表达式3: 语句3 else: 语句e 逻辑:当程序执行到if-elif-else语句时,首先计算表达式1的值,如果表达式1的值为假,则执行表达式2,如果表达式为真,那么执行语句1依次向下.最后都没有的话执行else while语句 死循环:表达式永远为真的循环 while 1: print("你是个好人") while 表达式:

SQL中的条件判断语句(case when zhen if,ifnull)用法

一.case when then 适用于:sqlserver 和mysql case具有两种格式.简单case函数和case搜索函数.这两种方式,可以实现相同的功能.简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式.还有一个需要注重的问题,case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略. --简单case函数case sex  when '1' then '男'  when '2' then '女’  else '其他' e

PHP条件控制语句之“if语句”

if语句的作用 在所有的编程语言中,例如C语言.JAVA等,都有if语句的存在,当然也包括PHP.if语句的作用就是按照条件选择执行不同的代码片段.无锡大理石测量平台 我们看一下if语句的格式 1 2 if(表达式)        PHP语句; 如果表达式为真的话,,那么就执行PHP语句,否则就会跳过该语句,往下执行 如果执行的语句不只一条,我们可以使用“{}”包起来,像下面这样 1 2 3 4 5 if(表达式){ PHP语句1; PHP语句2; PHP语句3; } 在“{}”语句我们称为语句

C# 将Access中时间段条件查询的数据添加到ListView中

C# 将Access中时间段条件查询的数据添加到ListView中 一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集合中添加表头中的文字. 二.利用代码给ListView添加Item. 首先,ListView的Item属性包括Items和SubItems.必须先实例化一个ListIteView对象.具体如下: ListViewItem listViewItem=new ListViewItem(); l

js中的条件语句

1 //js中的条件语句 2 3 var age=60; 4 5 6 //example1 单分支语句 7 if(age>30){ 8 console.log("你已经不年轻了!"); 9 }else{ 10 console.log("你依然很有活力!"); 11 } 12 13 14 //example2 多分子语句 当程序执行到第一个满足条件的情况下就不再往下判断 15 16 if(age>40&&age<=60){ 17 co

shell中if条件字符串、数字比对,[[ ]]和[ ]区别

shell中if条件字符串.数字比对,[[ ]]和[ ]区别 引用: http://www.51testing.com/?uid-7701-action-viewspace-itemid-13731 http://blog.csdn.net/sunboy_2050/article/details/6836382 shell 括号 学习shell的时候总是被shell里的条件判断方式搞得头疼,经常不知道改 用[],[[]],(())还是test,let,而很少有书把它们的关系讲解的很清楚(应该是我