Oracle的学习心得和知识总结(九)|Oracle数据库PL/SQL语言条件选择语句之IF和CASE语句技术详解

news2024/11/17 1:43:23

注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:

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

语法格式如下:

在这里插入图片描述

语义解释如下:

  1. boolean_expression 值为 TRUE、FALSE 或 NULL 的表达式
  2. 始终评估第一个 boolean_expression。仅当前面的表达式的值为 FALSE 时,才会评估每个其他 boolean_expression(指的是 ELSIF)
  3. 如果对 boolean_expression 求值并且其值为 TRUE,则相应的 THEN 之后的语句将运行。不计算后续表达式,并且不运行与它们关联的语句
  4. 如果没有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 语句从一系列条件中进行选择并运行相应的语句。

  1. 简单的 CASE 语句计算单个表达式并将其与多个潜在值进行比较
  2. 搜索的 CASE 语句评估多个布尔表达式并选择第一个值为 TRUE 的表达式

二者语法格式如下:

在这里插入图片描述

二者语义解释如下:

  1. simple_case_statement中的selector :其值被评估一次并用于选择多个备选方案之一的表达式。选择器可以具有除 BLOB、BFILE 或用户定义类型之外的任何 PL/SQL 数据类型
  2. WHEN selector_value THEN statement:selector_value 可以是除 BLOB、BFILE 或用户定义类型之外的任何 PL/SQL 类型的表达式。selector_values按顺序计算。如果 selector_value 的值等于 selector 的值,则与该 selector_value 关联的语句运行,CASE 语句结束。不再评估后续的 selector_values
  3. ELSE statement [statement ]… :当且仅当没有 selector_value 具有与 selector 相同的值时,语句才会运行。如果没有 ELSE 子句,且也如果没有 selector_value 具有与 selector 相同的值,系统将引发预定义异常 CASE_NOT_FOUND
  4. label:标识语句的标签

  1. searched_case_statement中的WHEN boolean_expression THEN statement:boolean_expressions 按顺序求值。如果 boolean_expression 的值为 TRUE,则运行与该 boolean_expression 关联的语句,并且 CASE 语句结束。不再评估后续的 boolean_expressions
  2. ELSE statement [statement ]…:当且仅当没有 boolean_expression 的值为 TRUE 时,语句才会运行。如果没有 ELSE 子句,如果没有 boolean_expression 的值为 TRUE,系统将引发预定义异常 CASE_NOT_FOUND
  3. 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Lua实战]整理Lua中忽略的问题

整理Lua中忽略的问题1.元表metatable和元方法1.1元方法_index可以设置为table1.2.元方法_index可以设置为函数1.3.元方法_index和_newindex实现只读table2.Lua强制GC方法2.1 collectgarbage()3.协程和线程的区别3.1协程coroutine.create()是同步执行,不是并行,只是切了一个上下…

Day874.MySQL索引选择出错问题 -MySQL实战

MySQL索引选择出错问题 Hi,我是阿昌,今天学习记录的是关于MySQL索引选择出错问题的内容。 写 SQL 语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由 MySQL 来确定的。 不知道有没有碰到过这种情况&#xff0…

Android开发进阶—invoke反射及其原理解析

反射的概念 反射:Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活成成员的信息程序中的对象一般都是在编译时就确定下来,Java反射机制可以动态地创建对象并且…

含有吲哚基团132557-72-3,2,3,3-三甲基-3H-吲哚-5-磺酸

基础产品数据(Basic Product Data):CAS号:132557-72-3中文名:2,3,3-三甲基-3H-吲哚-5-磺酸,2,3,3-三甲基-3H-吲哚-6-磺酸钾盐英文名:5-Sulfo-2,3,3-trimethyl indolenine sodium salt&#xff0…

Axure原型图设计工具使用记录

Axure原型图设计工具使用记录 Axure快速入门(01) - 面板介绍 https://blog.51cto.com/u_15294985/3007677 Axure快速入门(02) - 入门例子(登录案例) https://developer.aliyun.com/article/1046689 Axu…

03 python 要点(函数+类)

第8章 函数 8.1 定义函数 函数就是执行特定任务的一段代码, 自定义函数的语法格式, 以英文半角冒号结尾. # def: 8.2 调用函数 在定义好函数后,既可调用函数. 8.2.1 使用位置参数调用函数 在调用函数时传递的实参与定义函数时的形参顺序一致,这…

LoongArch上正常使用`pip install`

原创:你在使用loongarch架构操作系统时,是否遇到pip install 安装失败的情况? 刷到这篇文章,大家可添加评论或者私信我,及时满足大家的需求那么,下面讲一下如何配置loongarch架构的pip 仓库及开发原理如何配…

Java集合(五)LinkedList底层扩容源码分析

LinkedList的全面说明: (1)LinkedList底层实现了双向链表和双端队列特点 (2)可以添加任意元素(元素可以重复),包括null. (3)线程不安全,没有实现同步 LinkedList的底…

MicroBlaze系列教程(1):AXI_GPIO的使用

文章目录 @[toc]简介常用函数使用示例参考资料工程下载本文是Xilinx MicroBlaze系列教程的第1篇文章。 简介 AXI GPIO是基于AXI-lite总线的一个通用输入输出IP核,可配置为一个或两个通道,每个通道32位,每一位可以通过SDK动态配置成输入或输出方向,支持中断请求,配合中断控…

计算机网络第三章 传输层

本文部分图片(PPT截图)来自中科大计算机网络top down3.0 目录[TOC]3.1 概述传输层TCP和UDP协议可以在IP协议主机到主机通信的基础上,实现进程到进程之间的通信(利用端口号)真正实现端到端的通信【通过多路复用于解复用…

b站黑马Vue2后台管理项目笔记——(3)用户列表

说明: 此项目中使用的是本地SQL数据库,Vue2。 其他功能请见本人后续的其他相关文章。 本文内容实现的最终效果如下图: 三.用户列表的开发 目标效果: 点击二级菜单——用户列表,在右侧展示用户列表对应的内容&#xf…

羊了个羊,低配纯前端实现,代码开源

各位朋友们大家好,我是克隆窝。 我属实被“羊了个羊”气到了,就是通不过第二关,迫不得已自己弄了个网页版的“鱼了个鱼” 游戏的玩法非常简单,类似 “消消乐”,从一堆方块中找到相同图案的 3 个方块并消除即可。 文末…

火山引擎边缘计算在云边协同方面的探索与实践

作者:杜怀宇近期,由边缘计算产业联盟(ECC)主办的2022边缘计算产业峰会(ECIS2022)以云端直播形式成功举办,峰会以“边云智联 助力行业数字化转型”为主题,汇聚来自全球的商业领袖、国…

JavaScript基础复盘1

JS有三种书写位置,分别为行内,内嵌和外部。 注意,引用外部JS文件,script双标签内部不可以写代码了。 JavaScript输入输出语句 变量 变量的使用 变量再使用时分为两步:1.声明变量 2.赋值 实现用JavaScript接受用户输入…

最近公共祖先

最近公共祖先(Lowest Common Ancestor,LCA) 指两个点的公共祖先中,离根最远/深度最深的 性质: 1.LCA({u})uLCA\left(\left\{u\right\}\right) uLCA({u})u 2.若uuu是vvv的祖先,当且仅当LCA(u,v)uLCA\left(…

[Lua实战]Skynet-1.如何启动(linux环境启动)[开箱可用]

Skynet-如何启动1.依赖环境:可登录&联网的linux(Centos7)系统(可以是虚拟机)2.yum安装依赖库3.git clone skynet项目4.编译skynet4.1有可能遇到的错误(升级gcc到4.9以上即可解决):5.测试运行skynet6.运行结果最近用到了lua,想了解下云风大神的skynet,在网上看了半天也没入门…

Spire.Pdf for Java v9.1.4 Patcher

Spire.PDF for Java是一种 PDF API,它使 Java 应用程序无需使用第三方SDK 即可读取、写入和保存 PDF 文档。使用这个 Java PDF 组件,开发人员和程序员可以实现丰富的功能,从头开始创建 PDF 文件或完全在 Java 应用程序(J2SE 和 J2…

leetcode刷题记录总结-7.二叉树

文章目录零、二叉树理论二叉树的种类满二叉树完全二叉树二叉搜索树平衡二叉搜索树二叉树的存储方式二叉树的遍历方式二叉树的定义总结一、二叉树的遍历[144. 二叉树的前序遍历 ](https://leetcode.cn/problems/binary-tree-preorder-traversal/)题解递归实现迭代实现[94. 二叉树…

如何运营企业网站

企业网站的最终目的是给企业带来效益,树立企业形象。只要有这个目标定位,剩下的工作就是围绕这个定位去做和优化,米贸搜整理如下:1.增强被收录页面的重要性。收录页面的提升不仅仅是数量的提升,质量占据了很高的比重。…

网络安全协议

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 前言 本章将会进行网络安全协议的讲解 一.网络安全 1.什么是网络安全 网络安全&#xff…