目录结构
注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:
1、参考书籍:《Oracle Database SQL Language Reference》
2、参考书籍:《PostgreSQL中文手册》
3、EDB Postgres Advanced Server User Guides,点击前往
4、PostgreSQL数据库仓库链接,点击前往
5、PostgreSQL中文社区,点击前往
6、Oracle数据库 5.1 Conditional Selection Statements 官方文档说明,点击前往
7、EDB数据库 Control structures v14官方文档说明,点击前往
1、本文内容全部来源于开源社区 GitHub和以上博主的贡献,本文也免费开源(可能会存在问题,评论区等待大佬们的指正)
2、本文目的:开源共享 抛砖引玉 一起学习
3、本文不提供任何资源 不存在任何交易 与任何组织和机构无关
4、大家可以根据需要自行 复制粘贴以及作为其他个人用途,但是不允许转载 不允许商用 (写作不易,还请见谅 💖)
5、本文仅适于从事于PostgreSQL数据库内核开发者和数据库爱好者,对普通读者而言难度较大 但对于希望从事于数据库内核开发的初学者来说,是一次机会十分难得的学习案例 💪
6、本文内容基于PostgreSQL15.0源码开发而成
Oracle数据库PL/SQL语言条件选择语句之IF和CASE语句技术详解
- 本人博客严正声明
- 文章快速说明索引
- 条件选择语句说明
- IF Statement
- IF THEN Statement
- IF THEN ELSE Statement
- IF THEN ELSIF Statement
- CASE Statement
- Simple CASE Statement
- Searched CASE Statement
本人博客严正声明
是这样的,熟悉在下的小伙伴们都知道 我写博客主要目的就是分享和学习总结。至于CSDN的排名 排名什么的,我并不是很在意!
- 一来 很不喜欢标题党
- 二来 更反感灌些水文
- 三来 痛恨无下限抄袭
本人博客都是认认真真写的,结果在CSDN并没有什么的太大的名气 关注度什么的也不高!前些天 一位好心的粉丝私聊了在下,反而一名某平台的哥们儿 快把我的《PostgreSQL的学习心得和知识总结》都给照搬过去了,甚至一个字都不改(连同在下 都是只字不提 好歹稍微提一下呀)!!!
实在是太过分,后来经过(友好)协商,现已经全部删除了!
本人是做PostgreSQL内核开发的,深感当下学风不正 大家都很浮躁,一向踏踏实实深耕的并不是很多!因为写代码这件事情上,欺骗不了任何人!本本分分老老实实地写好代码做好学问十分不易,容不得掺沙子和造假!这里把我喜欢的一句话送给各位以共勉:
非淡泊无以明志,
非宁静无以致远!
文章快速说明索引
学习目标:
目的:接下来这段时间我想做一些兼容Oracle数据库PL/SQL语言上的一些功能开发,本专栏这里主要是学习以及介绍Oracle数据库功能的使用场景、原理说明和注意事项等,基于PostgreSQL数据库的功能开发等之后 由新博客进行介绍和分享!今天我们主要看一下 PL/SQL语言 条件选择语句之IF和CASE语句 的相关内容!
学习内容:(详见目录)
1、Oracle数据库PL/SQL语言 条件选择语句之IF和CASE语句技术详解
学习时间:
2023-01-30 10:42:04
学习产出:
1、Oracle数据库PL/SQL语言 条件选择语句之IF和CASE语句技术详解
2、CSDN 技术博客 1篇
注:下面我们所有的学习环境是Centos7+PostgreSQL15.0+Oracle19c+MySQL5.7
postgres=# select version();
version
-----------------------------------------------------------------------------
PostgreSQL 15.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.1.0, 64-bit
(1 row)
postgres=#
#-----------------------------------------------------------------------------#
SQL> select * from v$version;
BANNER Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
BANNER_FULL Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production Version 19.17.0.0.0
BANNER_LEGACY Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
CON_ID 0
#-----------------------------------------------------------------------------#
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.19 |
+-----------+
1 row in set (0.06 sec)
mysql>
注:我们这里所用的Oracle环境是在线环境:
- SQL Worksheets - Oracle Live SQL,点击前往
条件选择语句说明
条件选择语句,针对不同的数据值运行不同的语句。条件选择语句有 IF 和 CASE。条件选择语句:IF 和 CASE 针对不同的数据值运行不同的语句。
IF 语句根据条件运行或跳过一系列一个或多个语句。IF 语句具有以下形式:
- IF THEN
- IF THEN ELSE
- IF THEN ELSIF
CASE 语句从一系列条件中进行选择,并运行相应的语句。CASE 语句具有以下形式:
- 简单的 CASE 语句(
Simple CASE statement
),它计算单个表达式并将其与多个潜在值进行比较 - 搜索 CASE 语句(
Searched CASE statement
),它评估多个条件并选择第一个为真的条件
当对每个备选方案采取不同的操作时,CASE 语句是合适的。
IF Statement
语法格式如下:
语义解释如下:
- boolean_expression 值为 TRUE、FALSE 或 NULL 的表达式
- 始终评估第一个 boolean_expression。仅当前面的表达式的值为 FALSE 时,才会评估每个其他 boolean_expression(指的是 ELSIF)
- 如果对 boolean_expression 求值并且其值为 TRUE,则相应的 THEN 之后的语句将运行。不计算后续表达式,并且不运行与它们关联的语句
- 如果没有boolean_expression的值为 TRUE,则运行 ELSE 之后的语句
IF THEN Statement
IF THEN 语句根据条件运行或跳过一系列一个或多个语句。IF THEN 语句具有以下结构:
IF condition THEN
statements
END IF;
如上,如果条件为真,语句运行;否则,IF 语句什么都不做。
示例如下:
DECLARE
n1 PLS_INTEGER := 27;
n2 PLS_INTEGER := 37;
quota PLS_INTEGER := 0;
result VARCHAR2(3) := 'No';
BEGIN
IF n1 > (quota + 30) THEN
result := 'Yes';
END IF;
DBMS_OUTPUT.PUT_LINE (
'The number1 is greater than the target value ? ' || result
);
IF n2 > (quota + 30) THEN
result := 'Yes';
END IF;
DBMS_OUTPUT.PUT_LINE (
'The number2 is greater than the target value ? ' || result
);
END;
/
Statement processed.
The number1 is greater than the target value ? No
The number2 is greater than the target value ? Yes
IF THEN ELSE Statement
IF THEN ELSE 语句具有以下结构:
IF condition THEN
statements
ELSE
else_statements
END IF;
如果 condition 的值为真,则语句运行;否则,运行 else_statements。
示例1如下:
DECLARE
n1 PLS_INTEGER := 27;
result VARCHAR2(30) := 'No';
BEGIN
IF n1 >= 30 THEN
result := 'Greater than or equal to ';
ELSE
result := 'Less than ';
END IF;
DBMS_OUTPUT.PUT_LINE (
'The number1 ' || result || '30'
);
END;
/
Statement processed.
The number1 Less than 30
示例2如下:
DECLARE
n1 PLS_INTEGER := 27;
result PLS_INTEGER := -2;
BEGIN
IF n1 >= 30 THEN
result := 1;
ELSE
IF n1 >= 20 THEN
result := 0;
ELSE
result := -1;
END IF;
END IF;
DBMS_OUTPUT.PUT_LINE (
'The result is ' || result
);
END;
/
Statement processed.
The result is 0
IF THEN ELSIF Statement
IF THEN ELSIF 语句具有以下结构:
IF condition_1 THEN
statements_1
ELSIF condition_2 THEN
statements_2
[ ELSIF condition_3 THEN
statements_3
]...
[ ELSE
else_statements
]
END IF;
- IF THEN ELSIF 语句运行第一个条件为真的语句。不评估其余条件
- 如果没有条件为真,则运行 else_statements(如果存在);否则,IF THEN ELSIF 语句不执行任何操作
单个 IF THEN ELSIF 语句比逻辑上等效的嵌套 IF THEN ELSE 语句更容易理解,如下:
-- IF THEN ELSIF statement
IF condition_1 THEN statements_1;
ELSIF condition_2 THEN statements_2;
ELSIF condition_3 THEN statement_3;
END IF;
-- Logically equivalent nested IF THEN ELSE statements
IF condition_1 THEN
statements_1;
ELSE
IF condition_2 THEN
statements_2;
ELSE
IF condition_3 THEN
statements_3;
END IF;
END IF;
END IF;
示例1如下:
DECLARE
n1 PLS_INTEGER := 27;
result PLS_INTEGER := -2;
BEGIN
IF n1 >= 30 THEN
result := 1;
ELSIF n1 >= 20 THEN
result := 0;
ELSE
result := -1;
END IF;
DBMS_OUTPUT.PUT_LINE (
'The result is ' || result
);
END;
/
Statement processed.
The result is 0
示例2如下:
-- IF THEN ELSIF 语句模拟简单的 CASE 语句
DECLARE
grade CHAR(1);
BEGIN
grade := 'B';
IF grade = 'A' THEN
DBMS_OUTPUT.PUT_LINE('Excellent');
ELSIF grade = 'B' THEN
DBMS_OUTPUT.PUT_LINE('Very Good');
ELSIF grade = 'C' THEN
DBMS_OUTPUT.PUT_LINE('Good');
ELSIF grade = 'D' THEN
DBMS_OUTPUT. PUT_LINE('Fair');
ELSIF grade = 'F' THEN
DBMS_OUTPUT.PUT_LINE('Poor');
ELSE
DBMS_OUTPUT.PUT_LINE('No such grade');
END IF;
END;
/
Statement processed.
Very Good
CASE Statement
CASE 语句从一系列条件中进行选择并运行相应的语句。
- 简单的 CASE 语句计算单个表达式并将其与多个潜在值进行比较
- 搜索的 CASE 语句评估多个布尔表达式并选择第一个值为 TRUE 的表达式
二者语法格式如下:
二者语义解释如下:
simple_case_statement
中的selector
:其值被评估一次并用于选择多个备选方案之一的表达式。选择器可以具有除 BLOB、BFILE 或用户定义类型之外的任何 PL/SQL 数据类型WHEN selector_value THEN statement
:selector_value 可以是除 BLOB、BFILE 或用户定义类型之外的任何 PL/SQL 类型的表达式。selector_values按顺序计算。如果 selector_value 的值等于 selector 的值,则与该 selector_value 关联的语句运行,CASE 语句结束。不再评估后续的 selector_values- ELSE statement [statement ]… :当且仅当没有 selector_value 具有与 selector 相同的值时,语句才会运行。如果没有 ELSE 子句,且也如果没有 selector_value 具有与 selector 相同的值,系统将引发预定义异常 CASE_NOT_FOUND
- label:标识语句的标签
searched_case_statement
中的WHEN boolean_expression THEN statement
:boolean_expressions 按顺序求值。如果 boolean_expression 的值为 TRUE,则运行与该 boolean_expression 关联的语句,并且 CASE 语句结束。不再评估后续的 boolean_expressions- ELSE statement [statement ]…:当且仅当没有 boolean_expression 的值为 TRUE 时,语句才会运行。如果没有 ELSE 子句,如果没有 boolean_expression 的值为 TRUE,系统将引发预定义异常 CASE_NOT_FOUND
- label:标识语句的标签
Simple CASE Statement
简单的 CASE 语句具有以下结构:
CASE selector
WHEN selector_value_1 THEN statements_1
WHEN selector_value_2 THEN statements_2
...
WHEN selector_value_n THEN statements_n
[ ELSE
else_statements ]
END CASE;]
如上,selector 是一个表达式(通常是单个变量)。 每个 selector_value 可以是文字或表达式。
- 简单的 CASE 语句运行第一个 selector_value 等于 selector 的语句。不评估其余条件
- 如果没有 selector_value 等于选择器,则 CASE 语句运行 else_statements(如果存在),否则引发预定义异常 CASE_NOT_FOUND
示例如下:
DECLARE
grade CHAR(1);
BEGIN
grade := 'A';
CASE grade
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');
WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');
ELSE DBMS_OUTPUT.PUT_LINE('No such grade');
END CASE;
END;
/
Statement processed.
Excellent
Searched CASE Statement
搜索到的 CASE 语句具有以下结构:
CASE
WHEN condition_1 THEN statements_1
WHEN condition_2 THEN statements_2
...
WHEN condition_n THEN statements_n
[ ELSE
else_statements ]
END CASE;]
- 搜索到的 CASE 语句运行第一个条件为真的语句。不评估其余条件
- 如果没有条件为真,则 CASE 语句运行 else_statements(如果它们存在),否则引发预定义的异常 CASE_NOT_FOUND
示例1如下:(逻辑上等于上面的simple CASE statement
)
DECLARE
grade CHAR(1);
BEGIN
grade := 'B';
CASE
WHEN grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent');
WHEN grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good');
WHEN grade = 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');
WHEN grade = 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');
WHEN grade = 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');
ELSE DBMS_OUTPUT.PUT_LINE('No such grade');
END CASE;
END;
/
Statement processed.
Very Good
示例2如下:
CREATE OR REPLACE PROCEDURE print_boolean (b BOOLEAN)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE (
CASE
WHEN b IS NULL THEN 'Unknown'
WHEN b THEN 'Yes'
WHEN NOT b THEN 'No'
END
);
END;
/
BEGIN
print_boolean(TRUE);
print_boolean(FALSE);
print_boolean(NULL);
END;
/
Procedure created.
Statement processed.
Yes
No
Unknown
Procedure dropped.
示例3如下:(CASE 语句中用 EXCEPTION 代替 ELSE 子句)
DECLARE
grade CHAR(1);
BEGIN
grade := 'Z';
CASE
WHEN grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent');
WHEN grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good');
WHEN grade = 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');
WHEN grade = 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');
WHEN grade = 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');
END CASE;
EXCEPTION
WHEN CASE_NOT_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No such grade');
END;
/
Statement processed.
No such grade