plsql programming 04 条件和顺序控制
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 条件和顺序控制的更多相关文章
- Python学习--04条件控制与循环结构
Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...
- plsql programming 13 其他数据类型
bolean 类型 raw 类型, 用来保存和操作少量的二进制数据. urowid 和 rowid 类型, 这两种数据类型表示数据库的 rowid. 所谓 rowid 就是一个标识符-用来表示数据库中 ...
- plsql programming 17 过程, 函数与参数
代码模块化, 即将一大块代码拆成若干小块(过程), 然后就可以在其他模块调用这些模块了, 这样, 重用性更好, 也方便管理. 过程: 过程是一个可以像执行 PL/SQL 语句一样调用的程序, 一个过程 ...
- plsql programming 16 动态SQL和动态PLSQL
动态SQL 是指在执行时才构建 SQL 语句, 相对于静态 sql 的编译时就已经构建. 动态PLSQL 是指整个PL/SQL代码块都是动态构建, 然后再编译执行的. 作用: 1. 可以支持 DDL ...
- plsql programming 01 plsql概述
授权 从 oracle 8i 开始, oracle 用通过提供 authid 子句为 pl/sql 的执行授权模型, 这样我们可以选择使用 authid current_user(调用者权限)来执行这 ...
- plsql programming 14 DML和事务管理
我们可以把多个SQL语句集中在一起, 在逻辑上组成一个事务, 从而保证这些操作或者全部被保存到数据库(用sql的说法就是”提交”), 或者被整体驳回(用sql的说法是“回滚”). 事务: ACID 原 ...
- plsql programming 11 记录类型
记录类型非常类似数据库表中的行. 记录作为一个整体本身并没有值, 不过每个单独成员或字段都有值, 记录提供了一种把这些值当做一组进行操作的方法. 例如: 1: -- create a table 2: ...
- plsql programming 10 日期和时间戳
年 月 日 时 分 秒 时区 用小时表示的相对于 UTC 的时差 用分钟表示的相对于 UTC 的时差 date 存储日期和时间, 不带时区, 精确到秒 timestamp 存储日期和时间, 不带时区, ...
- plsql programming 07 使用数据
数据类型 char, Nchar varchar2, Nvarchar2 clob, Nclob number number(9, 2); -- 定点小数, 小数点左边7位, 右边2位 number ...
随机推荐
- RabbitMQ 3.6 安装
1. 首先安装这个 http://www.erlang.org/downloads 2. 再安装这个 http://www.rabbitmq.com/install-windows.html 3. 添 ...
- Springmvc jar包介绍
spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-m ...
- phyreengine 3.12.0 安装遇到的问题
发现他们文档都是旧的....略渣阿 需要安装vs2012 update4 vs2013update4 nvdia cg toolkits 3.1 以及 windows SDK 8.1 编译运行第一个s ...
- sprytabbedpanels.js库之在页面中插入Tabbed Panels
向页面加入sprytabbedpanels.js文件.<script src="SpryAssets/SpryTabbedPanels.js" type="text ...
- JS对象类型的确定
JS是松散类型的语言,这一点JS的对象表现得尤为突出.那么如何来确定JS对象的具体类型呢? 首先,我们可以使用typeof运算符确定其基本类型(number,object,function,undef ...
- Ogre1.8.1源码编译
本文的编译环境为Windows7_SP1 + VS2010_SP1 + CMake2.8.11 :) 资源下载 1. 下载Ogre1.8.1的源代码,下载链接地址:http://www.ogre3 ...
- Extjs整体加载树节点
Ext.onReady(function () { Ext.define('company', { extend: 'Ext.data.Mode ...
- 总结 | 如何测试你自己的 RubyGem
如何测试一个Gem gem 开发完了,想要给别人用,那就需要测试啊,测试一个 gem 其实很简单,这里我们用 minitest 为例, rspec 也一样适用.先来看看我们当前这个 gem 的目录结构 ...
- Eclipse里面开发ExtJS程序
首先在http://extjs.org.cn/download下载ext ,我下载的版本是ext-3.4.1.1-gpl,下载好以后解压. 然后在eclipse里面先建立一个web项目,建立好后再we ...
- JSONObject 包的依赖
commons-lang.jar commons-beanutils.jar commons-collections.jar commons-logging.jar ezmorph.jar json- ...