1. 条件语句

if salary > 40000 or salary is NULL

then

give_bonus(employee_id, 500);

end if;

if condition

then

---

else

---

end if;

if condition

then

statement1

elsif condition

then

statement2

else

statement3

end if;

例如:

IF salary >= 10000 AND salary <=20000 THEN
give_bonus(employee_id, 1500);
ELSIF salary > 20000 AND salary <= 40000 THEN
give_bonus(employee_id, 10000);
ELSIF salary > 40000 THEN
give_bouns(employee_id, 400);
END IF;

嵌套的 IF 语句

IF condition 1 THEN

IF codition 2 THEN

IF condition 3 THEN

statement 3

END IF;

statement 2

END IF;

statement 1

END IF;

像这种嵌套最好不要超过3层, 否则就比较难理解和维护.

2. case 语句

case expression

when result1 then

statement1

when result2 then

statement2

else

statement_else

end case;

例如:

CASE employee_type
WHEN 'S' THEN
award_salary_bonus(employee_id);
WHEN 'H' THEN
award_hourly_bonus(employee_id);
WHEN 'C' THEN
award_commissioned_bonus(employee_id);
ELSE
RAISE invalid_employee_type;
END CASE;

case 作出 if else 效果

CASE TRUE
WHEN salary >= 10000 AND salary <= 20000 THEN

give_bouns(employee_id, 1500);

WHEN salary > 20000 AND salary < 40000 THEN

give_bouns(employee_id, 1000);

ELSE

give_bouns(employee_id, 0);

END CASE;

搜索CASE 模型

CASE

WHEN salary > 40000 THEN

give_bonus(employee_id, 1500);

WHEN salary > 20000 THEN

give_bonus(employee_id, 1000);

ELSE

give_bonus(employee_id, 0);

END CASE;

CASE 规则:

  • 一旦某些语句被执行, 整个执行也就结束了, 即便下边还有结果满足case的表达式, 换言之, 这里的case 自动带有 break,
  • ELSE 语句是可选的, 如果没有指定 ELSE,并且没有一个表达式求值结果是 true, 就会抛出 CASE_NOT_FOUND 异常.
  • WHEN 表达式是按照从上到下的顺序被依次求值.

另外 CASE 语句的边界重叠问题, 要注意, 尽量让 CASE 的条件之间没有任何重叠部分.

CASE 表达式

简单型 CASE 表达式, 例如: (case 后边接表达式, 而这个表达式是我们想要的)

declare

boolean_true BOOLEAN := TRUE;

boolean_false BOOLEAN := FALSE;

boolean_null BOOLEAN;

FUNCTION boolean_to_varchar2(flag IN BOOLEAN) RETURN VARCHAR2 IS

BEGIN''

RETURN

CASE flag

WHEN TRUE THEN 'True'

WHEN FALSE THEN 'False'

ELSE 'NULL'

END;

END;

BEGIN

DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_true));

DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_false));

DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_null));

END;

复杂类型的 case 表达式, case后边不接表达式, 例如:

declare

salary NUMBER := 20000;

employee_id NUMBER := 36325;

bonus_amount NUMBER;

BEGIN

bonus_amount :=

CASE

WHEN salary >= 10000 AND salary <= 20000 THEN 1500

WHEN salary > 20000 AND salary <= 40000 THEN 1000

WHEN salary > 40000 THEN 500

ELSE 0

END * 10;    -- 注意这步将结果乘以 10 了

DBMS_OUTPUT.PUT_LINE(bonus_amout);

END;

与 CASE 语句不同, 即使 CASE 表达式中没有 WHEN 子句被选择也不会抛出异常, 相反, 如果没有WHEN条件被满足, CASE 表达式就会返回 NULL.

只要可以使用其他类型表达式的地方, 就可以使用 CASE 表达式, 另外, case表达式只用一个 END; 来作为结尾.

NULL 语句

当你想让 PLSQL 什么也不做时, 就可以使用 NULL 语句, 例如:

IF condition THEN

statment1

ELSE

null;  -- do nothing

END IF;

plsql programming 04 条件和顺序控制的更多相关文章

  1. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  2. plsql programming 13 其他数据类型

    bolean 类型 raw 类型, 用来保存和操作少量的二进制数据. urowid 和 rowid 类型, 这两种数据类型表示数据库的 rowid. 所谓 rowid 就是一个标识符-用来表示数据库中 ...

  3. plsql programming 17 过程, 函数与参数

    代码模块化, 即将一大块代码拆成若干小块(过程), 然后就可以在其他模块调用这些模块了, 这样, 重用性更好, 也方便管理. 过程: 过程是一个可以像执行 PL/SQL 语句一样调用的程序, 一个过程 ...

  4. plsql programming 16 动态SQL和动态PLSQL

    动态SQL 是指在执行时才构建 SQL 语句, 相对于静态 sql 的编译时就已经构建. 动态PLSQL 是指整个PL/SQL代码块都是动态构建, 然后再编译执行的. 作用: 1. 可以支持 DDL ...

  5. plsql programming 01 plsql概述

    授权 从 oracle 8i 开始, oracle 用通过提供 authid 子句为 pl/sql 的执行授权模型, 这样我们可以选择使用 authid current_user(调用者权限)来执行这 ...

  6. plsql programming 14 DML和事务管理

    我们可以把多个SQL语句集中在一起, 在逻辑上组成一个事务, 从而保证这些操作或者全部被保存到数据库(用sql的说法就是”提交”), 或者被整体驳回(用sql的说法是“回滚”). 事务: ACID 原 ...

  7. plsql programming 11 记录类型

    记录类型非常类似数据库表中的行. 记录作为一个整体本身并没有值, 不过每个单独成员或字段都有值, 记录提供了一种把这些值当做一组进行操作的方法. 例如: 1: -- create a table 2: ...

  8. plsql programming 10 日期和时间戳

    年 月 日 时 分 秒 时区 用小时表示的相对于 UTC 的时差 用分钟表示的相对于 UTC 的时差 date 存储日期和时间, 不带时区, 精确到秒 timestamp 存储日期和时间, 不带时区, ...

  9. plsql programming 07 使用数据

    数据类型 char, Nchar varchar2, Nvarchar2 clob, Nclob number number(9, 2);  -- 定点小数, 小数点左边7位, 右边2位 number ...

随机推荐

  1. codeforces #232 div2 解题报告

    A:简单题:我们可以把点换成段处理,然后枚举段看是否被霸占了: #include<iostream> #include<]; ]=;     ;i<=n;i++)     { ...

  2. hdu 1171

    求能装入大小为sum/2的背包的最大价值 #include <cstdio> #include <cstdlib> #include <cmath> #includ ...

  3. Sqli-labs less 31

    Less-31 Less-31与上述两个例子的方式是一样的,我们直接看到less-31的sql语句: 所以payload为: http://127.0.0.1:8080/sqli-labs/Less- ...

  4. c#实现串口操作 SerialPort

    命名空间:using System.IO.Ports;该类提供了同步 I/O 和事件驱动的 I/O.对管脚和中断状态的访问以及对串行驱动程序属性的访问. 操作类声明: SerialPort sp = ...

  5. 请教DotNetBar控件中的CalendarView控件如何拖动当前的时间轴

    本人想拖动那个当前的时间轴或者让时间轴变动,因为那个时间轴默认的是当前时间.(就是那个黄色的线)

  6. 简单的说说jsonp

    jsonp和json有什么区别?json是一种文件格式,而jsonp是一种技术方法. jsonp会被人认为是一种新的跨域技术,其实本质上和利用带有src属性的标签进行js跨域本质没什么区别. 区别就是 ...

  7. ZOJ3550 Big Keng(三分)

    题意:给定一个立体的图形,上面是圆柱,下面是圆台,圆柱的底面半径和圆台的上半径相等,然后体积的V时,问这个图形的表面积最小可以是多少.(不算上表面).一开始拿到题以为可以YY出一个结果,就认为它是圆锥 ...

  8. http://my.oschina.net/u/719192/blog/506062?p={{page}}

    http://my.oschina.net/u/719192/blog/506062?p={{page}}

  9. Redis 集群实现

    Nosql,作为程序员在当下不了解点儿,还真不行,出去聊起来别人就会说你土.那么就聊聊其中一个比较火的redis.redis单机版没得说,但是一直没有集群版,有也是山寨的.前段时间对redis的实现进 ...

  10. 安卓四大组件之--service

    服务:长期后台运行的没有界面的activity,程序写法和activity类似. 安卓系统进程管理是按照一定规则的: 1.默认情况下,关闭掉一个应用程序,清空了这个应用程序的任务栈,应用程序的进程还会 ...