Oracle PL/SQL Programming 第4章:Language Fundamentals 读书笔记

总的目录和进度,请参见开始读 Oracle PL/SQL Programming 第6版

本章介绍两种类型的 PL/SQL 控制语句:条件控制语句和顺序控制语句。 几乎您编写的每一段代码都需要条件控制,即根据条件指导程序执行流程的能力。 您可以使用 IF-THEN-ELSE 和 CASE 语句来执行此操作。 还有CASE表达式; 虽然与 CASE 语句不同,但它们有时可用于完全消除对 IF 或 CASE 语句的需要。 极少情况下,您需要告诉 PL/SQL 通过 GOTO 语句无条件转移控制,或者通过 NULL 语句显式地不执行任何操作。

IF Statements

IF 语句允许您在程序中实现条件分支逻辑。

IF 语句有三种形式,如下表所示。

IF 类型特征
IF THEN
END IF;
这是 IF 语句的最简单形式。 IF 和 THEN 之间的条件决定是否执行 THEN 和 END IF 之间的语句集。 如果条件的计算结果为 FALSE 或 NULL,则不执行代码。
IF THEN
ELSE
END IF;
这种组合实现了非此即彼的逻辑:根据 IF 和 THEN 关键字之间的条件,执行 THEN 和 ELSE 之间或 ELSE 和 END IF 之间的代码。 执行这两部分可执行语句之一。
IF THEN
ELSIF
ELSE
END IF;
IF 语句的最后一种也是最复杂的形式从一系列互斥条件中选择一个为 TRUE 的条件,然后执行与该条件关联的语句集。 这种情况应该考虑使用搜索 CASE 语句。

The IF-THEN Combination

IF-THEN 语法的一般格式如下:

IF 条件
THEN... 代码 ...
END IF;

条件为TRUE则执行代码,条件也可能为FALSE或NULL。

THREE-VALUED LOGIC

二值逻辑指布尔逻辑,即只提供真和假;三值逻辑除真假外,还提供一个不确定值,NULL,例如:

2 < NULL

要了解有关三值逻辑的更多信息,我推荐 Lex de Haan 和 Jonathan Gennick 的 Oracle 杂志文章“Nulls:Nothing to Worry About”。 您可能会发现 C. J. Date 的书《Database in Depth: Relational Theory for the Practitioner》也很有帮助。

使用 IS NULL 和 IS NOT NULL 等运算符或 COALESCE 和 NVL2 等函数是检测和处理潜在 NULL 值的好方法。 对于您编写的每个布尔表达式中引用的每个变量,请务必仔细考虑该变量为 NULL 时的后果。

格式方面,充分利用缩进和格式,使 IF 语句的逻辑易于理解。 未来的维护程序员会感谢你的。

The IF-THEN-ELSE Combination

当您想要在两个互斥的操作之间进行选择时,请使用 IF-THEN-ELSE 格式。

IF condition
THEN... TRUE 可执行语句序列 ...
ELSE... FALSE/NULL 可执行语句序列 ...
END IF;

需要记住的重要一点是,两个语句序列之一将始终执行,因为 IF-THEN-ELSE 是一个非此即彼的结构。

USING BOOLEAN FLAGS

通常,使用布尔变量作为标志很方便,这样您就不需要多次计算相同的布尔表达式。 执行此操作时,请记住布尔表达式的结果可以直接分配给布尔变量。

即,下面的语句:

IF 表达式
...

可以用以下替代,好处我理解是可以打印值,方便调试:

boolean_variable = 表达式;
IF boolean_variable 
...

The IF-THEN-ELSIF Combination

IF 条件1
THEN语句1
ELSIF 条件2
THEN语句2
[ELSE语句N]
END IF;

IF-THEN-ELSIF通常应该用CASE替代。注意ELSIF后面必须跟THEN,只有ELSE后面不需要THEN

Avoiding IF Syntax Gotchas

  • IF和END IF必须成对出现
  • END和IF间必须有空格
  • ELSIF 不要写成 ELSEIF
  • 只有END IF后面必须跟分号

IF-ELSIF中的条件,按顺序评估。如果有多个条件TRUE(应尽量避免),则先满足的会被执行,余下的不会评估。

Nested IF Statements

对于复杂的逻辑,嵌套IF通常是必要的,但要小心,因为其难以理解和调试。

嵌套IF的好处是,只有外层的IF为TRUE是,内层的IF才会评估。

Short-Circuit Evaluation

捷径评估是指不必评估IF语句中的所有表达式。例如逻辑AND和逻辑OR。

IF 条件1 AND 条件2
THEN...
ELSE...
END IF;

条件1为FALSE或NULL时,PL/SQL可以停止对表达式的求值,因为只有当表达式的结果为TRUE时才执行THEN分支,并且这需要两个操作数都为TRUE。一旦发现一个操作数不是TRUE,则不再有机会执行THEN分支。

注意,捷径评估仅适用于IF表达式,但对于赋值语句则不适用。
例如:

my_boolean := 条件1 AND 条件2

如果条件1为NULL,则仍会继续评估条件2。因为此时my_boolean 的值取决于条件2。若条件2为NULL,则my_boolean 为NULL,若条件2为FALSE,则my_boolean 为FALSE。

关于这点,详见文章Nulls: Nothing to Worry About中的图1。

捷径评估也适用于CASE语句和CASE表达式。

CASE Statements and Expressions

CASE语句包括简单CASE和搜索CASE两类。CASE语句外,还有CASE表达式。

在PL/SQL的范畴,前面布尔表达式的赋值可以有TRUE,FALSE和NULL。而放在关系型数据库的范畴,三值逻辑中只有TRUE,FASLE和UNKNOWN。例如SQL的WHERE条件和CHECK约束。NULL和UNKNOWN是不同的。

Simple CASE Statements

先评估expression,根据结果再判断执行哪一分支。

CASE expression
WHEN result1 THENstatements1
WHEN result2 THENstatements2
...
ELSEstatements_else
END CASE;

ELSE部分是可选的。但你没有写ELSE时,PL/SQL会隐式替换为以下:

ELSERAISE CASE_NOT_FOUND;

这和IF是不一样的,IF不会报错。

这里要注意的关键点是,前面的语法图中显示的表达式(expression)和结果元素(result*#n*)可以是标量值,也可以是计算结果为标量值的表达式。例如:

CASE TRUE
...
WHEN A > 200 AND ...

为了避免 CASE_NOT_FOUND 错误,请确保不会存在任何条件都不满足的情况。

Searched CASE Statements

搜索的 CASE 语句计算布尔表达式列表,当它找到计算结果为 TRUE 的表达式时,执行与该表达式关联的语句序列。

CASE
WHEN expression1 THENstatements1
WHEN expression2 THENstatements2
...
ELSEstatements_else
END CASE;

与简单的 CASE 语句一样,适用以下规则:

  • 一旦执行了一系列语句,执行就会结束。 如果多个表达式的计算结果为 TRUE,则仅执行与第一个此类表达式关联的语句。
  • ELSE 子句是可选的。 如果未指定 ELSE,并且没有表达式计算结果为 TRUE,则会引发 CASE_NOT_FOUND 异常。
  • WHEN 子句按从上到下的顺序进行评估。

注意:由于 WHEN 子句是按顺序求值的,因此您可以通过首先列出最可能的 WHEN 子句来提高代码的效率。 此外,如果您的 WHEN 子句包含“昂贵”的表达式(例如,需要大量 CPU 和内存),您可能需要将它们列在最后,以尽量减少它们被评估的机会。

Nested CASE Statements

CASE 语句可以像 IF 语句一样嵌套。

CASE
WHEN ...CASEWHEN ......END CASE;
...   
END CASE;

CASE Expressions

CASE 表达式对于表达式的作用与 CASE 语句对于语句的作用相同。 简单的 CASE 表达式允许您根据作为输入提供的标量值选择要计算的表达式。 搜索的 CASE 表达式对表达式列表进行计算,以找到第一个计算结果为 TRUE 的表达式,然后返回关联表达式的结果。

CASE 表达式有以下两种形式:

Simple_Case_Expression :=CASE expressionWHEN result1 THENresult_expression1WHEN result2 THENresult_expression2...ELSEresult_expression_elseEND;Searched_Case_Expression :=CASEWHEN expression1 THENresult_expression1WHEN expression2 THENresult_expression2...ELSEresult_expression_elseEND;

CASE 表达式返回单个值,即选择的 result_expression 的结果。 每个 WHEN 子句必须与一个表达式(无语句)关联。 不要使用分号或 END CASE 来标记 CASE 表达式的结束。 CASE 表达式由简单的 END 终止。

其实有点像look-up table。

与 CASE 语句不同,如果在 CASE 表达式中未选择 WHEN 子句,则不会引发错误。 相反,当不满足 WHEN 条件时,CASE 表达式将返回 NULL。

The GOTO Statement

GOTO 语句执行无条件分支到 PL/SQL 块的同一执行部分中的另一个可执行语句。 与该语言中的其他结构一样,如果您正确且谨慎地使用 GOTO,您的程序将会变得更加强大。

GOTO 语句的一般格式是:

GOTO 标签名称;

其中 label_name 是标识目标语句的标签名称。 这个GOTO标签在程序中定义如下:

<<标签名称>>

GOTO 语句有几个限制:

  • 标签后面必须至少有一条可执行语句。
  • 目标标签必须与 GOTO 语句位于同一范围内。
  • 目标标签必须与 GOTO 位于 PL/SQL 块的同一部分。

由于 PL/SQL 提供了如此多不同的控制结构和模块化技术,因此您几乎总能找到比 GOTO 更好的方法来完成某些任务。我不建议用。

The NULL Statement

在某些情况下,您希望 PL/SQL 不执行任何操作,此时 可用NULL 语句:

NULL;

NULL使用场景,包括:

  • 提高代码的可读性
  • 为调试,作为临时的占位符
  • 作为<<标签名称>>后面的语句,因为标签后面必须有语句

单词

  • decipherable 可破译的,好理解的

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

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

相关文章

Java基于SpringBoot+Vue的网上超市管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

C++类和对象(中)六个默认成员函数

&#x1f308;类的六个默认成员函数 任何一个类&#xff0c;不管是否为空&#xff0c;都会在生成的时候默认调用六个成员函数&#xff0c;这些成员函数可以自动生成&#xff0c;也可以由程序员写出。这六个默认成员函数分别是&#xff1a; 最主要的是前四个&#xff1a; 初始…

༺༽༾ཊ—Unity之-02-抽象工厂模式—ཏ༿༼༻

首先创建一个项目&#xff0c; 在这个初始界面我们需要做一些准备工作&#xff0c; 建基础通用文件夹&#xff0c; 创建一个Plane 重置后 缩放100倍 加一个颜色&#xff0c; 任务&#xff1a;使用 抽象工厂模式 创建 人物与宠物 模型&#xff0c; 首先资源商店下载 人物与宠物…

终于搞懂了网盘网页是怎么唤醒本地应用了

写在前面 用百度网盘举例,可以通过页面打开本机的百度网盘软件,很多软件的网站页面都有这个功能。这个事情一直令我比较好奇,这次终于有空抽时间来研究研究了,本篇讲的是Windows的,mac的原理与之类似。 自定义协议 本身单凭浏览器是没有唤醒本地应用这个能力的,不然随…

幻兽帕鲁(Palworld)v0.1.3免安装中文版(下载及配置中文及服务器搭建)

配置中文 进入到游戏文件夹中 Palworld.v0.1.3.0\game\Engine\Binaries\ThirdParty\Steamworks\Steamv153\Win64\steam_settings设置中文 simplified chinesewindows搭建服务器 要求 中央处理器4核&#xff08;推荐&#xff09;内存16千兆字节&#xff08;GB&#xff09; …

PyTorch 深度学习实践 第3讲 梯度下降算法

B站--刘二大人《PyTorch深度学习实践》完结合集 03. 梯度下降算法 PPT 链接&#xff1a;网盘 提取码&#xff1a;cxe4 步骤&#xff1a;1.dataset 2.model 3.training&#xff08;确定权重&#xff09; 4.inferring 1.分治法 容易只找到局部最优&#xf…

1 计算机网络概述(二):计算机网络的拓扑结构,标准化组织

目录 1 计算机网络的拓扑结构1.1 网络拓扑的概念1.2 通信子网的信道类型1、点到点式网络2、广播式网络 1.3 常见的计算机网络拓扑结构 2 网络协议和标准化组织2.1 网络协议2.2 标准化组织 1 计算机网络的拓扑结构 1.1 网络拓扑的概念 拓扑学由图论演变而来&#xff0c;在拓扑…

如何保证MySQL数据一致性

在当今大数据时代&#xff0c;数据库系统扮演着至关重要的角色&#xff0c;而MySQL作为一种流行的关系型数据库管理系统&#xff0c;在数据一致性方面拥有着丰富的机制和技术。下面简单的探讨MySQL是如何保证数据一致性的。 事务与ACID特性 要了解MySQL如何保证数据一致性&am…

postman用法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、postman怎么使用json输出 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0…

C++ 数论相关题目:高斯消元解异或线性方程组

输入一个包含 n 个方程 n 个未知数的异或线性方程组。 方程组中的系数和常数为 0 或 1 &#xff0c;每个未知数的取值也为 0 或 1 。 求解这个方程组。 异或线性方程组示例如下&#xff1a; M[1][1]x[1] ^ M[1][2]x[2] ^ … ^ M[1][n]x[n] B[1] M[2][1]x[1] ^ M[2][2]x[2]…

部署TOMCAT详解

目录 一、Tomcat概述 1.1Tomcat简介 1.2、Tomcat历史 1.3Tomcat官网 二、部署单实例Tomcat 1.下载Tomcat包 2. 解压Tomcat包 3.配置环境变量 4.刷新环境变量 5.查看tomcat是否安装成功 6.启动Tomcat 三、Tomcat目录介绍 1、tomcat主目录介绍 2.webapps目录介绍 3…

【国产MCU】-CH32V307-GPIO控制-外部中断

GPIO控制-外部中断 文章目录 GPIO控制-外部中断1、CH32V307中断介绍2、GPIO外部中断相关API3、外部中断使用代码实现CH32V3x 系列内置可编程快速中断控制器(PFIC– Programmable Fast Interrupt Controller),最多支持255 个中断向量。当前系统管理了88 个外设中断通道和8 个…

Java面试题之 IO(三)

Java面试题之 IO&#xff08;三&#xff09; 文章目录 Java面试题之 IO&#xff08;三&#xff09;字节缓冲流BufferedInputStream&#xff08;字节缓冲输入流&#xff09;BufferedOutputStream&#xff08;字节缓冲输出流&#xff09; 字符缓冲流打印流 文章来自Java Guide 用…

TCP/IP网络模型

大家好我是苏麟 , 今天聊聊TCP/IP四层网络模型 . 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 应用层 最上层的&#xff0c;也是我们能直接接触到的就是应用层&#xff08;Application Layer&#xff09;&#xff0c;我们电脑或手机使用的应用软件都…

ElasticSearch面试题整理(持续更新)

1. Elasticsearch 中的倒排索引是什么&#xff1f; Elasticsearch 使用一种称为倒排索引的结构&#xff0c;ES中的倒排索引其实就是 lucene 的倒排索引&#xff0c;区别于传统的正向索引&#xff0c;倒排索引会再存储数据时将关键词和数据进行关联&#xff0c;保存到倒排表中&…

Redis持久化策略指南,如何根据业务需求选择合适的方案

推荐一款我一直在用国内很火的AI网站&#xff0c;包含GPT3.5/4.0、文心一言、通义千问、智谱AI等多个AI模型&#xff0c;支持PC、APP、VScode插件同步使用&#xff0c;点击链接跳转->海鲸AI-自动生成代码 前言 Redis是一个被广泛使用的内存数据结构存储系统&#xff0c;它支…

1、PDManer 快速入门

文章目录 序言一、快速入门1.1 PDMan 介绍1.2 特点1.3 下载和安装 小结 序言 本人长期以来一直从事于应用软件的研发以及项目实施工作&#xff0c;经常做数据库建模&#xff08;数据表设计&#xff09;。有一款称心如意的数据库建模工具&#xff0c;自然能够事半功倍&#xff0…

JDK8新增的接口方法

第一种是默认方法&#xff1a; public interface A {//1.默认方法&#xff1a;必须使用default修饰&#xff0c;默认会被public修饰public default void test1(){System.out.println("默认方法");} } 默认方法就是实例方法&#xff0c;必须使用对象触发访问&#x…

洛谷C++简单题小练习day8—Bookshelf B

day8--Bookshelf B--1.30 习题概述 题目描述 Farmer John 最近为奶牛们的图书馆添置了一个巨大的书架&#xff0c;尽管它是如此的大&#xff0c;但它还是几乎瞬间就被各种各样的书塞满了。现在&#xff0c;只有书架的顶上还留有一点空间。 所有(1≤N≤20,000) N头奶牛都有一…

python爬虫概念及介绍

1. 什么是互联网爬虫&#xff1f; 解释 1 &#xff1a;通过一个程序&#xff0c;根据 Url ( http : // www . taobao . com ) 进行爬取网页&#xff0c;获取有用信息 解释 2&#xff1a;使用程序模拟浏览器&#xff0c;去向服务器发送请求&#xff0c;获取响应信息 2. 爬虫核…