asp动态网站开发考试/如何创建网站平台
总的目录和进度,请参见开始读 Oracle PL/SQL Programming 第6版
本章探讨 PL/SQL 的迭代控制结构(也称为循环),它允许您重复执行相同的代码。
PL/SQL 提供了三种不同类型的循环结构:
- 简单或无限循环
- FOR 循环(数字和游标)
- WHILE 循环
每种类型的循环都是针对特定目的而设计:
属性 | 描述 |
---|---|
循环如何终止 | 循环重复执行代码。 如何使循环停止执行其主体? |
何时进行终止测试 | 终止测试是在循环的开始还是结束时进行? 后果是什么? |
使用此循环的原因 | 您应该考虑哪些特殊因素来确定此循环是否适合您的情况? |
Loop Basics
为什么存在三种不同类型的循环? 为了给您提供灵活性,为了代码简单,更容易理解和维护。
Examples of Different Loops
简单或无限循环:
LOOPEXIT WHEN i > 100;...;i:= i + 1;
END LOOP;
FOR循环(数字):
FOR i IN 1 .. 100
LOOP...;
END LOOP;
FOR循环(游标):
FOR i IN (SELECT ...)
LOOP...;
END LOOP;
WHILE循环:
WHILE (i <= 100)
LOOP...;
END LOOP;
Structure of PL/SQL Loops
虽然这三个循环结构之间存在差异,但每个循环都有两个部分:
-
循环边界
它由启动循环的保留字、导致循环终止的条件以及结束循环的 END LOOP 语句组成。 -
循环体
这是循环边界内的可执行语句序列,在循环的每次迭代中执行。
The Simple Loop
形式为:
LOOP执行语句...
END LOOP;
仅当执行语句包含EXIT或EXIT WHEN时,才会退出循环;否则为无限循环。
EXIT;
EXIT WHEN 判断条件;
EXIT WHEN等同于IF-THEN加EXIT。
使用简单循环的场景:
- 希望循环至少执行1次
- 无法确定循环需执行多少次
当存在单个条件表达式来确定循环是否应终止时,最好使用 EXIT WHEN。 在有多个退出条件的情况下,或者当您需要根据不同的条件设置从循环中退出时,最好使用 IF 或 CASE 语句,然后加上EXIT 语句 。
Emulating a REPEAT UNTIL Loop
PL/SQL中没有WHILE…UNTIL语句,但有类似的实现:
LOOP...EXIT WHEN ...;
END LOOP;
The Intentionally Infinite Loop
无限循环可能存在,但通常都会加sleep语句:
LOOP 执行操作;DBMS_LOCK.sleep(10);
END LOOP;
如何终止无限循环?在交互式PL/SQL中可以用“Ctrl+C”,在后台运行的程序可以用操作系统的kill命令,注意数据库中的ALTER SYSTEM KILL SESSION
命令不一定可以终止无限循环。但是kill命令有可能误杀,例如在共享服务器模式下。
作者推荐的方式为利用PL/SQL中的管道,这类似于Shell编程中的信号:
DECLAREpipename CONSTANT VARCHAR2(12) := 'signaler';result INTEGER;pipebuf VARCHAR2(64);
BEGIN/* create private pipe with a known name */result := DBMS_PIPE.create_pipe(pipename);LOOPDBMS_OUTPUT.PUT_LINE('I''m doing works ...'); -- 请替换为实际执行的操作DBMS_LOCK.sleep(5);/* see if there is a message on the pipe */IF DBMS_PIPE.receive_message(pipename, 0) = 0THEN/* interpret the message and act accordingly */DBMS_PIPE.unpack_message(pipebuf);IF pipebuf = 'stop'THENDBMS_OUTPUT.PUT_LINE('Exiting ...');EXIT;END IF;END IF;END LOOP;
END;
上面是接收信号的程序,下面是发送信号的程序:
DECLAREpipename VARCHAR2 (12) := 'signaler';result INTEGER := DBMS_PIPE.create_pipe (pipename);
BEGINDBMS_PIPE.pack_message ('stop');result := DBMS_PIPE.send_message (pipename);
END;
测试在SQL Plus中通过,但SQL Developer没有通过,不知为何。
以下为成功时的输出:
I'm doing works ...
I'm doing works ...
I'm doing works ...
I'm doing works ...
I'm doing works ...
Exiting ...PL/SQL procedure successfully completed.
此示例使用私有管道,因此发送和接收程序需为同一用户。 另请注意,私有管道的数据库命名空间在当前用户运行的所有会话中是全局的。
The WHILE Loop
如事先不知道循环执行的次数(可以一次都不执行),则可使用 WHILE 循环:
WHILE 布尔变量|表达式
LOOP执行语句
END LOOP;
The Numeric FOR Loop
PL/SQL FOR 循环有两种:数字FOR 循环和游标FOR 循环。 数字 FOR 循环是传统且熟悉的“计数”循环。 FOR 循环的迭代次数在循环开始时就已知。
范围方案隐式声明循环索引(如果尚未声明),指定范围的起点和终点,并可选择指定循环索引进行的顺序(从最低到最高或从最高到最低)。
FOR loop index IN [REVERSE] lowest number .. highest number
LOOPexecutable statement(s)
END LOOP;
Rules for Numeric FOR Loops
- 不要声明循环索引。 PL/SQL 自动且隐式地将其声明为数据类型为 INTEGER 的局部变量。 该索引的范围是循环本身; 您不能在循环外引用循环索引。
- 范围方案中使用的表达式(最低和最高边界)在循环开始时评估一次。 在循环执行期间不会重新评估范围。所以,后面改了也不会生效。
- 切勿在循环内更改循环索引或范围边界的值。
Examples of Numeric FOR Loops
一个倒计时程序:
BEGIN
FOR i IN REVERSE 1 .. 10
LOOPDBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;
还有范围可以由常数定义,也可以由变量或表达式定义。
Handling Nontrivial Increments
和C语言不一样,PL/SQL中的循环索引的步增/步减永远是1。所以,如果增减量为非1,则需要另加IF判断,如MOD函数。
The Cursor FOR Loop
游标 FOR 循环是与直接合并在循环边界内的显式游标或 SELECT 语句关联(并实际由其定义)的循环。 仅当需要从游标中获取并处理每条记录时(游标经常出现这种情况),才使用游标 FOR 循环。
游标 FOR 循环充分利用了过程结构与 SQL 数据库语言的强大功能的紧密且有效的集成。 它减少了从游标获取数据所需编写的代码量。 它大大减少了在编程中引入循环错误的机会,而循环是程序中最容易出错的部分之一。
FOR record IN { cursor_name | (explicit SELECT statement) }
LOOPexecutable statement(s)
END LOOP;
其中 record 是由 PL/SQL 使用 %ROWTYPE 属性针对cursor_name 指定的游标隐式声明的记录。
不要显式声明与循环索引记录同名的记录。 它不是必需的(PL/SQL 隐式声明它在循环中使用)并且可能导致逻辑错误。 有关在循环执行之外或之后访问有关游标 FOR 循环记录的信息的提示,请看本文后面部分:Obtaining Information About FOR Loop Execution。
Example of Cursor FOR Loops
没有用游标FOR循环之前:
SET SERVEROUTPUT ON
DECLARECURSOR hr_cur ISSELECT first_name, last_nameFROM employees WHERE department_id = 100;hr_rec hr_cur%ROWTYPE;
BEGINOPEN hr_cur;LOOPFETCH hr_cur INTO hr_rec;EXIT WHEN hr_cur%NOTFOUND;DBMS_OUTPUT.PUT_LINE(hr_rec.first_name || ' ' || hr_rec.last_name);END LOOP;CLOSE hr_cur;END;
用游标FOR循环后,简洁很多! 无需记录的声明。 OPEN、FETCH 和 CLOSE 语句已消失。 不再需要检查 %NOTFOUND 属性。:
SET SERVEROUTPUT ON
DECLARECURSOR hr_cur ISSELECT first_name, last_nameFROM employees WHERE department_id = 100;
BEGINFOR hr_rec IN hr_curLOOPDBMS_OUTPUT.PUT_LINE(hr_rec.first_name || ' ' || hr_rec.last_name);END LOOP;END;
与所有其他游标一样,您可以在游标 FOR 循环中将参数传递给游标?。 如果光标选择列表中的任何列是表达式,请记住您必须在选择列表中为该表达式指定别名。 在循环内,访问游标记录中特定值的唯一方法是使用点符号(record_name.column_name,如 ocupancy_rec.room_number),因此您需要一个与表达式关联的列名。
Loop Labels
您可以使用标签为循环命名。 格式为:
<<label_name>>
<<label_name>> 必须出现在循环体第一个语句之前,而在END LOOP也可以加label_name,但不是必须。
循环标签作用:
- 代码更容易维护和调试。就好像括号必须成对出现。
- 可使用标签来限定循环索引变量的名称,这有助于提高可读性。
- 当您有嵌套循环时,您可以使用标签来提高可读性并增强对循环执行的控制。如
EXIT loop_label [WHEN condition];
不过这种用户和GOTO一样不建议。
The CONTINUE Statement
CONTINUE 语句退出循环的当前迭代,并立即继续该循环的下一次迭代。 该语句有两种形式,就像 EXIT 一样:无条件 CONTINUE 和条件 CONTINUE WHEN。
下例演示了利用CONTINUE实现步进为3:
BEGINFOR l_index IN 1 .. 10LOOPCONTINUE WHEN MOD (l_index - 1, 3) != 0;DBMS_OUTPUT.PUT_LINE ('Loop index = ' || TO_CHAR (l_index));END LOOP;
END;
/
输出为:
Loop index = 1
Loop index = 4
Loop index = 7
Loop index = 10
您还可以使用 CONTINUE 终止内部循环并立即继续进行外部循环体的下一次迭代。 为此,您需要使用标签为外部循环命名。
IS CONTINUE AS BAD AS GOTO?
continue 语句不能滥用,但用对地方则很有价值,因为它使代码更短,使代码更易于阅读,并减少了对布尔变量的需求。
作者举了使用和不使用continue的2个例子作为对比。我看懂了,并认可。
使用continue的例子:
LOOPEXIT WHEN exit_condition_met;CONTINUE WHEN condition1;CONTINUE WHEN condition2;setup_steps_here;IF condition4 THENaction4_executed;CONTINUE;END IF;IF condition5 THENaction5_executed;CONTINUE; -- Not strictly required.END IF;
END LOOP;
如果不使用continue:
LOOPEXIT WHEN exit_condition_met;IF condition1THENNULL;ELSIF condition2THENNULL;ELSEsetup_steps_here;IF condition4 THENaction4_executed;ELSIF condition5 THENaction5_executed;END IF;END IF;
END LOOP;
Tips for Iterative Processing
循环是非常强大且有用的结构,但您应该谨慎使用它们。 程序中的性能问题通常可以追溯到循环,并且循环中的任何问题都会因其重复执行而被放大。 确定何时停止循环的逻辑可能非常复杂。 本节提供了一些关于如何编写干净、易于理解且易于维护的循环的技巧。
Use Understandable Names for Loop Indexes
使用有意义的循环索引变量名称,而非简单的i,j,k。
The Proper Way to Say Goodbye
结构化编程的一个重要且基本的原则是“一进一出”; 也就是说,程序应该有一个入口点和一个出口点。一个入口是必然的,这里讲的是如何避免多个出口。
您应该遵循以下循环终止准则:
- 不要在 FOR 和 WHILE 循环中使用 EXIT 或 EXIT WHEN 语句。
- 不要在循环中使用 RETURN 或 GOTO 语句,这同样会导致循环过早、非结构化终止。
如果需要根据游标 FOR 循环获取的信息终止循环(例如当取得值的合计大于某值时退出),则应使用 WHILE 循环或简单循环代替。 那么代码的结构就会更清楚地表达你的意图。
Obtaining Information About FOR Loop Execution
FOR 循环是方便且简洁的结构,对于游标 FOR 循环尤其如此。 然而,有一个权衡:数据库自动为您完成大量工作,但您在循环终止后对有关循环最终结果的信息的访问受到限制。
简单来说,游标 FOR 循环的END LOOP语句后,游标就被关闭了,也就是说,此时无法获取游标的信息。因此,你需要再循环内部(游标关闭前)暂存游标的信息,如行数(cursor%ROWCOUNT),后续关闭后就可以继续访问。
SQL Statement as Loop
实际上,您可以将像 SELECT 这样的 SQL 语句视为循环。 毕竟,这样的语句指定了对一组数据采取的操作; 然后,SQL 引擎“循环”数据集并应用操作。
例如一个数据归档的例子,从源表中逐行读取,然后插入归档表后删除。这既可以用PL/SQL实现,也可以用2条SQL实现(INSERT INTO … DELETE,DELETE )
SQL实现编写的代码更少,而且运行效率更高,因为减少了上下文切换的次数(在 PL/SQL 和 SQL 执行引擎之间来回移动)。 只执行一次插入和一次删除。
但SQL的灵活性差一点,因为SQL是事务型的,要么全成功,要么全失败;SQL也不能做特殊处理,如记录归档失败的记录。因此,PL/SQL 提供更大的灵活性。
总之,PL/SQL 提供一次访问和处理单行并采取操作(或许还有基于该特定记录内容的复杂过程逻辑)的能力。 另一方面,使用原生SQL代码更少,运行效率更高。必要时,可以混合使用 PL/SQL 和 SQL。
单词
- go figure 多奇怪!多怪异!多愚蠢!
相关文章:

Oracle PL/SQL Programming 第5章:Iterative Processing with Loops 读书笔记
总的目录和进度,请参见开始读 Oracle PL/SQL Programming 第6版 本章探讨 PL/SQL 的迭代控制结构(也称为循环),它允许您重复执行相同的代码。 PL/SQL 提供了三种不同类型的循环结构: 简单或无限循环FOR 循环&#x…...

C入门番外篇——C, Are you OK?
今日路上看到一个车牌,52U0K,感觉很有意思,如果做一下简单的翻译就是,“我爱你,好么?” 这样让我脑子中闪现了这样的一个画面:“一个男生追一个女生,看到女生不怎么搭理自己的样子&a…...

python-产品篇-游戏-象棋
文章目录 代码效果 代码 import pygame import time import constants from button import Button import pieces import computerclass MainGame():window NoneStart_X constants.Start_XStart_Y constants.Start_YLine_Span constants.Line_SpanMax_X Start_X 8 * Lin…...

用linux文件系统的链接功能实现文件缓存LRU
概述: 目前,随着家庭宽带网络、无线宽带技术,以及终端设备性能的不断发展,基于多媒体的应用越来越广泛,特别是互联网视频的应用更是成为推动这些技术发展的源动力。作为互联网视频VOD的应用,提高视频播放的流畅度是一个非常重要的指标之一。除了编解码技术,视频C…...

AI大模型开发架构设计(10)——AI大模型架构体系与典型应用场景
文章目录 AI大模型架构体系与典型应用场景1 AI大模型架构体系你了解多少?GPT 助手训练流程GPT 助手训练数据预处理2个训练案例分析 2 AI 大模型的典型应用场景以及应用架构剖析AI 大模型的典型应用场景AI 大模型应用架构 AI大模型架构体系与典型应用场景 1 AI大模型架构体系你…...

C# async/await的使用
C# 中的 async 和 await 关键字是用于实现异步编程的重要工具,它们简化了编写和维护非阻塞代码的过程。以下是对这两个关键字用法的简要说明: async 关键字 定义异步方法:在方法声明前使用 async 关键字,表示该方法是一个异步方…...

C语言之找单身狗
个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客 题目: 在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。…...

读懂 FastChat 大模型部署源码所需的异步编程基础
原文:读懂 FastChat 大模型部署源码所需的异步编程基础 - 知乎 目录 0. 前言 1. 同步与异步的区别 2. 协程 3. 事件循环 4. await 5. 组合协程 6. 使用 Semaphore 限制并发数 7. 运行阻塞任务 8. 异步迭代器 async for 9. 异步上下文管理器 async with …...

【华为】GRE VPN 实验配置
【华为】GRE VPN 实验配置 前言报文格式 实验需求配置思路配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN :(Virtual Private Network),即“…...

创建一个VUE项目(vue2和vue3)
背景:电脑已经安装完vue2和vue3环境 一台Mac同时安装vue2和vue3 https://blog.csdn.net/c103363/article/details/136059783 创建vue2项目 vue init webpack "项目名称"创建vue3项目 vue create "项目名称"...

Android 10.0 动态壁纸 LiveWallpaper
前言 在 Android 中,壁纸分为动态与静态两种,但其实两者得本质都是一样。都以一个 Service 得形式在后台运行,在一个类型为 TYPE_WALLPAPER 的窗口上绘制内容。也可以这么去理解:静态壁纸是一种特殊的动态壁纸,它仅在…...

Linux内核与驱动面试经典“小”问题集锦(4)
接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(3) 问题5 问:Linux内核中内存分配都有哪些方式?它们之间的使用场景都是什么? 备注:这个问题是笔者近期参加蔚来面试时遇到的一个问题。这…...

使用python实现:判断任意坐标点在STL几何模型的内部或外部
简介 在STL几何模型处理的过程中,经常需要判断一个点是否在模型的内部。网上给出的资料主要是使用C vtk的,而python vtk的很少。本文给出了一段精简版的python代码,实现判断任意坐标点在STL几何模型的内部或外部。 代码 首先定义三个函数 …...

leetcode(滑动窗口)483.找到字符中所有字母异位词(C++详细解释)DAY4
文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串&a…...

Leaf——美团点评分布式ID生成系统
0.普通算法生成id的缺点 1.Leaf-segment数据库方案 第一种Leaf-segment方案,在使用数据库的方案上,做了如下改变: - 原方案每次获取ID都得读写一次数据库,造成数据库压力大。改为利用proxy server批量获取,每次获取一…...

ProcessSlot构建流程分析
ProcessorSlot ProcessorSlot构建流程 // com.alibaba.csp.sentinel.CtSph#lookProcessChain private Entry entryWithPriority(ResourceWrapper resourceWrapper, int count, boolean prioritized, Object... args)throws BlockException {// 省略创建 Context 的代码// 黑盒…...

工业笔记本丨行业三防笔记本丨亿道加固笔记本定制丨极端温度优势
工业笔记本是专为在恶劣环境条件下工作而设计的高度耐用的计算机设备。与传统消费者级笔记本电脑相比,工业笔记本在极端温度下展现出了许多优势。本文将探讨工业笔记本在极端温度环境中的表现,并介绍其优势。 耐高温性能: 工业笔记本具有更高的耐高温性…...

游戏服务器多少钱一台?腾讯云32元,阿里云26元
游戏服务器租用多少钱一年?1个月游戏服务器费用多少?阿里云游戏服务器26元1个月、腾讯云游戏服务器32元,游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选,可以选择轻量应用服务器和云服务器,阿腾云atengyu…...

实战分享:SpringBoot在创新创业项目管理中的应用
✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...

vue3:28— Vue 2 对 Vue 3 的所有非兼容性改变。(vue3学习笔记终)
非兼容性改变 | Vue 3 迁移指南 过渡类名v-enter 修改为 v-enter-from、过渡类名 v-leave 修改为 v-leave-from 。keyCode 作为 v-on 修饰符的支持。v-model 指令在组件上的使用已经被重新设计,替换掉了v-bind.sync.v-if 和 v-for 在同一个元素身上使用时的优先级发…...

【学习笔记】TypeScript学习笔记1 --TypeScript中的类型
文章目录 TS总的变量类型References TS总的变量类型 备注: 如果一个变量设置为了any 类型之后相当于变量关闭了TS的类型检测 let d: any; d 10; d hello;//unknown表示的是未知类型,实际是上一个安全的any,unknown类型的变量不能直接赋值给其他变量le…...
矩阵的正定(positive definite)性质的作用
1. 定义 注意,本文中正定和半正定矩阵不要求是对称或Hermite的。 2. 性质 3. 作用 (1)Axb直接法求解 cholesky实对称正定矩阵求解复共轭对称正定矩阵求解LDL实对称非正定矩阵求解复共轭对称非正定矩阵求解复对称矩阵求解LU实非对称矩阵求解…...

用python编写爬虫,爬取房产信息
题目 报告要求 工程报告链接放在这里 https://download.csdn.net/download/Samature/88816284使用 1.安装jupyter notebook 2.用jupyter notebook打开工程里的ipynb文件,再run all就行 注意事项 可能遇到的bug 暂无,有的话私信我...

Swift Combine 从入门到精通一
1. Combine 简介 用 Apple 官方的话来说,Combine 是: a declarative Swift API for processing values over time. Combine 是 Apple 用来实现函数响应式编程的库, 类似于 RxSwift。 RxSwift 是 ReactiveX 对 Swift 语言的实现。 Combine 使用了许多可以…...

探索前端开发框架:React、Angular 和 Vue 的对决(一)
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

企业飞书应用机器人,使用python发送图文信息到群
企业飞书应用的自动化,需要创建企业应用,应用开通机器人能力,并获取机器人所需的app_id与app_secret(这一部分大家可以在飞书的控制台获取:https://open.feishu.cn/api-explorer/) 文章目录 步骤1ÿ…...

设计模式1-访问者模式
访问者模式是一种行为设计模式,它允许你定义在对象结构中的元素上进行操作的新操作,而无需修改这些元素的类。这种模式的主要思想是将算法与元素的结构分离开,使得可以在不修改元素结构的情况下定义新的操作。 所谓算法与元素结构分离&#x…...

Android meminfo 查看方法及解析
目录 Android 上查看memory 信息的方法 内存限制的信息 手动释放缓存 例 adb shell dumpsys meminfo pid 解析 adb shell dumpsys meminfo 汇总信息说明 Total RAM Free RAM ION Used RAM Lost RAM ZRAM /proc/meminfo 参考文档 Android 上查看memory 信息的方法 …...

微信小程序解决华为手机保存图片到相册失败
1.新增隐私设置 2.优化代码 新增uni.authorize判断 _saveCode() {let that this;console.log(点击了保存图片)console.log(this.result)uni.authorize({scope: scope.writePhotosAlbum,success(e) {console.log(e)if (this.result ! "") {uni.saveImageToPhotosAlb…...

板块零 IDEA编译器基础:第三节 下载和在IDEA中集成 Tomcat服务器 来自【汤米尼克的JAVAEE全套教程专栏】
板块零 IDEA编译器基础:第三节 下载和在IDEA中集成 Tomcat服务器 一、为什么选择Tomcat(1)常见的JAVA WEB服务器(2)选择Tomcat的理由 二、Tomcat 8.5下载解压三、Tomcat 结构目录四、在IDEA中集成Tomcat 假设我们已经…...