08-Oracle游标管理(定义,打开、获取数据及关闭游标)
目标
游标
•示例:显示当用户没有创建一个显示游标以获得多行结果时发生的情况。
DECLAREv_title books.title%TYPE;v_retail books.retail%TYPE;
BEGINSELECT title,retailINTO v_title,v_retailFROM books NATURAL JOIN orderitemsWHERE order#=1012;DBMS_OUTPUT.PUT_LINE('Books title: '||v_title||' Retail price: '||v_retail);
END;
声明显示游标
CURSOR cursor_name IS selectquery;
•前面示例中,需要一个显示游标来检索订单1012中的图书的书名和零售价。
DECLARECURSOR books_cursor ISSELECT title,retailFROM books NATURAL JOIN orderitemsWHERE order#=1012;
打开显示游标
OPEN cursor_name;示例:
OPEN books_cursor;打开游标之后,可以将游标中包含的数据赋给变量以进行处理
关闭显示游标
CLOSE cursor_nameCLOSE books_cursor;
从显示游标中提取数据
FETCH cursor_name INTO variablename[,…variablename];FETCH books_cursor INTO v_title,v_retail;
示例:显示游标的使用
DECLAREv_title books.title%TYPE;v_retail books.retail%TYPE;CURSOR books_cursor ISSELECT title,retailFROM books NATURAL JOIN orderitemsWHERE order#=1012;
BEGINOPEN books_cursor;FETCH books_cursor INTO v_title,v_retail;DBMS_OUTPUT.PUT_LINE('Books title: '||v_title||' Retail price: '||v_retail);CLOSE books_cursor;
END;
结果

结果中发现只有一行数据输出
独立执行这个PL/SQL块的SELECT语句,显示

| 游标属性 | 说明 |
| %ROWCOUNT | 指出处理的行 |
| %FOUND | 如果处理了一行或多行,这包含值TRUE——如果没有处理行,则为FALSE |
| %NOTFOUND | 如果没有处理行,则包含值TRUE——如果处理了一行或多行,则为FALSE |
| %ISOPEN | 如果在处理之后不关闭数据,这包含值TRUE——如果关闭游标,则为FALSE。在发生隐式游标时,由于它是自动关闭的,因此这个值在处理之后总是FALSE |
DECLAREv_title books.title%TYPE;v_retail books.retail%TYPE;CURSOR books_cursor ISSELECT title,retailFROM books NATURAL JOIN orderitemsWHERE order#=1012;
BEGINOPEN books_cursor;LOOPFETCH books_cursor INTO v_title,v_retail;EXIT WHEN books_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE('Books title: '||v_title||' Retail price: '||v_retail);END LOOP;CLOSE books_cursor;
END;
游标FOR循环
FOR record_name IN cursor_name LOOPstatements;[statement;…]
END LOOP;
说明:不是检索游标中的行并向变量赋值,而是将行的内容赋给一个记录。“记录”是一种复合数据类型,可以使其结构与检索的行的结构相同。要想指定记录的结构与检索的行的结构相同,可以在定义记录时使用%ROWTYPE属性。与%TYPE属性相似, %TYPE用来定义基于一个单独列的变量,而%ROWTYPE属性定义了基于数据库表中包含的所有列的记录。
示例:包含游标FOR循环的PL/SQL块
DECLARECURSOR books_cursor ISSELECT title,retailFROM books NATURAL JOIN orderitemsWHERE order#=1012;r_books books%ROWTYPE;
BEGINFOR r_books IN books_cursor LOOPDBMS_OUTPUT.PUT_LINE('Books title: '||r_books.title||' Retail price: '||r_books.retail);END LOOP;
END;
•示例说明:在块的声明部分定义了记录 r_books,它具有books表的结构。可执行部分包含一个游标FOR循环,它隐含打开books_cursor的游标,并将其内容赋给r_books记录对名为books_cursor的游标中包含的每一行都执行一次这个游标FOR循环。这个循环中包含的唯一一个语句将显示当前正在处理的行。注意:在DBMS_OUTPUT程序包显示的字符引用了记录中包含的列名称。因为将数据赋值给一个记录而不是单独的变量,所以显示值的唯一方法就是指定包含所需数据的列名称。在使用%ROWTYPE属性定义这个记录时,还为从books表中检索的各个值指定了列名称。要想指定应该显示哪一列或哪些列,必须在列名称之前添加包含数据的记录的名称,如r_books.title在处理了books_cursor中包含的最后一行之后,这个循环将会终止,将隐含关闭游标。
BEGINFOR r_books IN (SELECT title,retailFROM books NATURAL JOIN orderitemsWHERE order#=1012) LOOPDBMS_OUTPUT.PUT_LINE('Books title: '||r_books.title||' Retail price: '||r_books.retail);END LOOP;
END;
•修改示例,实现确定订单1012中购买的图书以及总应付款额。
DECLAREv_ordertotal NUMBER(5,2):=0;
BEGINFOR r_books IN (SELECT title,retail,quantityFROM books NATURAL JOIN orderitemsWHERE order#=1012) LOOPDBMS_OUTPUT.PUT_LINE('Books title: '||r_books.title||' Retail price: '||r_books.retail);v_ordertotal :=v_ordertotal + r_books.retail*r_books.quantity;END LOOP;DBMS_OUTPUT.PUT_LINE('Total Amount Due: '||v_ordertotal);
END;
带有逻辑运算符的游标循环控制
DECLAREv_title books.title%TYPE;v_retail books.retail%TYPE;v_number NUMBER(2):=&How_Many_Books_To_Display;CURSOR books_cursor ISSELECT title,retailFROM booksORDER BY retail DESC;
BEGINOPEN books_cursor;FETCH books_cursor INTO v_title,v_retail;WHILE books_cursor%ROWCOUNT<=v_number ANDbooks_cursor%FOUND LOOPDBMS_OUTPUT.PUT_LINE(v_title||','||v_retail);FETCH books_cursor INTO v_title,v_retail;END LOOP;CLOSE books_cursor;
END;

| AND | TRUE | FALSE | NULL | OR | TRUE | FALSE | NULL |
| TRUE | TRUE | FALSE | NULL | TRUE | TRUE | TRUE | TRUE |
| FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | NULL |
| NULL | NULL | FALSE | NULL | NULL | TRUE | NULL | NULL |
游标的使用——处理隐式游标
格式调用为: SQL%
注: INSERT, UPDATE, DELETE, SELECT 语句中不必明确定义游标。
隐式游标属性SQL %FOUND 布尔型属性 , 当最近一次读记录时成功返回,则值为 true ;SQL %NOTFOUND 布尔型属性 , 与 %found 相反;SQL %ROWCOUNT 数字型属性 , 返回已从游标中读取得记录数;SQL %ISOPEN 布尔型属性 , 取值总是 FALSE 。 SQL 命令执行完毕立即关闭隐式游标。
例:删除图书库存中某出版社出版的图书,如果不再存在该出版社的图书,则在出版设信息中删除该出版社信息.
DECLARE
v_pubid books.pubid%TYPE :=&in_pubid;
BEGINDELETE FROM books WHERE pubid=v_pubid;DBMS_OUTPUT.PUT_LINE('删除出版社编号为'||v_pubid||'的图书记录');COMMIT;IF SQL%NOTFOUND THENDELETE FROM publisher WHERE pubid=v_pubid;END IF;COMMIT;
END;
练习
总结
本人从事软件项目开发20多年,2005年开始从事Java工程师系列课程的教学工作,录制50多门精品视频课程,包含java基础,jspweb开发,SSH,SSM,SpringBoot,SpringCloud,人工智能,在线支付等众多商业项目,每门课程都包含有项目实战,上课PPT,及完整的源代码下载,有兴趣的朋友可以看看我的在线课堂
讲师课堂链接:https://edu.csdn.net/lecturer/893
相关文章:
08-Oracle游标管理(定义,打开、获取数据及关闭游标)
目标 1.确定何时需要显示游标2.声明、打开和关闭显示游标3.从显示游标中提取数据4.了解与游标有关的属性5.使用游标FOR循环检索游标中的数据6.在游标FOR循环的子查询中声明游标7.评估使用逻辑运算符结合在一起的布尔条件游标 1、在使用一个PL/SQL块来执行DML语句或只返回一行结…...
Python判断字符串是否包含特定子串的7种方法
目录1、使用 in 和 not in2、使用 find 方法3、使用 index 方法4、使用 count 方法5、通过魔法方法6、借助 operator7、使用正则匹配转自:https://cloud.tencent.com/developer/article/1699719我们经常会遇这样一个需求:判断字符串中是否包含某个关键词…...
aop实现接口访问频率限制
引言 项目开发中我们有时会用到一些第三方付费的接口,这些接口的每次调用都会产生一些费用,有时会有别有用心之人恶意调用我们的接口,造成经济损失;或者有时需要对一些执行时间比较长的的接口进行频率限制,这里我就简…...
Hive---窗口函数
Hive窗口函数 其他函数: Hive—Hive函数 文章目录Hive窗口函数开窗数据准备建表导入数据聚合函数window子句LAG(col,n,default_val) 往前第 n 行数据LEAD(col,n, default_val) 往后第 n 行数据ROW_NUMBER() 会根据顺序计算RANK() 排序相同时会重复,总数不会变DENSE…...
JavaSe第7次笔记
1. C语言里面,NULL是0地址。Java中null和0地址没关系。 2.数组可以做方法的返回值。 3.可以使用变量作为数组的个数开辟空间。 4.断言assert,需要设置。 5.排序:Arrays. sort(array); 6.查找: int index Arrays. binarySea…...
什么是 Service 以及描述下它的生命周期。Service 有哪些启动方法,有 什么区别,怎样停用 Service?
在 Service 的生命周期中,被回调的方法比 Activity 少一些,只有 onCreate, onStart, onDestroy, onBind 和 onUnbind。 通常有两种方式启动一个 Service,他们对 Service 生命周期的影响是不一样的。 1. 通过 startService Service 会经历 onCreate 到 onStart,然后处于运行…...
Redis部署
JAVA安装 mkdir /usr/local/javacd /usr/local/java/wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u13…...
AT32F437制作Bootloader然后实现Http OTA升级
首先创建一个AT32F437的工程,然后发现调试工程配置这里的型号和创建工程选的型号不一致,手动更改一下,使用PW Link下载程序的话还要配置一下pyocd.exe的路径。 打开drv_clk.c文件的调试功能看下系统时钟频率。 项目使用的是AT32F437VMT7芯片&…...
Springboot项目启动初始化数据缓存
1.从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解, PostConstruct和PreDestroy,这两个注解被用来修饰一个非静态的void()方法,被PostConstruct修饰的方法会在服务器加载Servlet的时候运…...
深度学习必备知识——模型数据集Yolo与Voc格式文件相互转化
在深度学习中,第一步要做的往往就是处理数据集,尤其是学习百度飞桨PaddlePaddle的小伙伴,数据集经常要用Voc格式的,比如性能突出的ppyolo等模型。所以学会数据集转化的本领是十分必要的。这篇博客就带你一起进行Yolo与Voc格式的相互转化&…...
数据、数据资源及数据资产管理的区别
整理不易,转发请注明出处,请勿直接剽窃! 点赞、关注、不迷路! 摘要:数据、数据资源、数据资产 数据、数据资源及数据资产的区别 举例 CRM系统建设完成后会有很多数据,这些数据就是原始数据,业务…...
标度不变性(scale invariance)与无标度(scale-free)概念辨析
文章目录标度标度种类名义标度序级标度等距标度比率标度常用标度方法不足标度不变性标度不变(Scale-invariant)曲线和自相似性(self-similarity)射影几何分形随机过程中的标度不变性标度不变的 Tweedie distribution普适性&#x…...
WMS仓库管理系统解决方案,实现仓库管理一体化
仓库是企业的核心环节,若没有对库存的合理控制和送货,将会造成成本的上升,服务品质的难以得到保证,进而降低企业的竞争能力。WMS仓库管理系统包括基本信息,标签,入库,上架,领料&…...
css常见定位、居中方案_css定位居中
一、 定位分类 1、静态定位 position:static;(默认,具备标准流条件) 2、相对定位 position:relative; 通过 top 或者 bottom 来设置 Y 轴位置 通过 left 或者 right 来设置 X 轴位置 特点: 相对定位不会脱离文档流相对于自…...
【微信小程序】-- 自定义组件 -- 创建与引用 样式(三十二)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
ArangoDB——AQL编辑器
AQL 编辑器 ArangoDB 的查询语言称为 AQL。AQL与关系数据库管理系统 (RDBMS)区别在于其更像一种编程语言,更自然地适合无模式模型,并使查询语言非常强大,同时保持易于读写。数据建模概念 数据库是集合的集合。集合存储记录,称为文…...
Lesson 9.1 集成学习的三大关键领域、Bagging 方法的基本思想和 RandomForestRegressor 的实现
文章目录一、 集成学习的三大关键领域二、Bagging 方法的基本思想三、RandomForestRegressor 的实现在开始学习之前,先导入我们需要的库,并查看库的版本。 import numpy as np import pandas as pd import sklearn import matplotlib as mlp import sea…...
basic1.0链码部署(基于test-network 环境ubuntu20.04腾讯云)
解决了官方示例指令需要科学上网才能运行的问题(通过手动下载二进制文件和拉取官方fabric-samples)。具体的将bootstrap.sh脚本解读了一遍 具体可以参照我的博客 fabric中bootstrap.sh到底帮助我们干了什么?(curl -sSL https://bi…...
Android---系统启动流程
目录 Android 系统启动流程 init 进程分析 init.rc 解析 Zygote 概叙 Zygote 触发过程 Zygote 启动过程 什么时Runtime? System Server 启动流程 Fork 函数 总结 面试题 Android 是 google 公司开发的一款基于 Linux 的开源操作系统。 Android 系统启动…...
【网络】http协议
🥁作者: 华丞臧. 📕专栏:【网络】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉 LeetCode刷题网站 文章…...
零基础玩转Llama-3.2-3B:Ollama部署+实战问答全流程
零基础玩转Llama-3.2-3B:Ollama部署实战问答全流程 1. 模型介绍与准备 1.1 Llama-3.2-3B模型概述 Llama-3.2-3B是Meta公司开发的多语言大型语言模型(LLM),属于Llama 3.2系列中的3B参数版本。这个纯文本模型经过指令微调优化&am…...
从if-else到assign:聊聊RTL代码风格如何影响X态传播与电路质量
从if-else到assign:RTL代码风格对X态传播与电路质量的深层影响 在数字IC设计领域,X态就像电路中的"幽灵信号",它无声无息地潜伏在设计中,直到某个关键时刻突然显现,引发难以追踪的异常行为。对于RTL工程师而…...
Insanely Fast Whisper终身学习模型:持续优化的语音识别系统设计
Insanely Fast Whisper终身学习模型:持续优化的语音识别系统设计 【免费下载链接】insanely-fast-whisper 项目地址: https://gitcode.com/GitHub_Trending/in/insanely-fast-whisper 你是否还在为语音识别速度慢、准确率低而烦恼?是否希望拥有一…...
SEO_从基础到精通,系统学习SEO的完整路径解析
<h2>SEO的基础:了解搜索引擎优化的核心概念</h2> <p>搜索引擎优化(SEO)是一个广泛且复杂的领域,它的核心在于提升网站在搜索引擎结果页面(SERP)中的自然排名。了解SEO的基础概念是每一个…...
清音刻墨镜像免配置亮点:内置10+中文领域词典(医疗/法律/IT)开箱即用
清音刻墨镜像免配置亮点:内置10中文领域词典(医疗/法律/IT)开箱即用 1. 为什么字幕对齐需要专业词典? 做视频字幕的朋友都知道,最头疼的不是生成文字,而是让文字和声音完美对齐。普通字幕工具遇到专业术语…...
【Linux信号】Linux进程信号(上):信号产生方式和闹钟
🎬 个人主页:艾莉丝努力练剑❄专栏传送门:《C语言》《数据结构与算法》《C/C干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》⭐️为天地立心,为生民立命…...
探索粗糙表面波动模型生成:打造不规则之美
粗糙表面,波动模型生成,用于在物体表面生成不规则的粗糙表面,或面表面的波动边界等,可自定义波动分布与赋值。在图形学和模拟领域,生成物体表面的粗糙质感或是波动边界常常是一个有趣又具有挑战性的任务。今天咱们就聊…...
黑丝空姐-造相Z-Turbo实战项目:数据库课程设计之AI图库管理系统
黑丝空姐-造相Z-Turbo实战项目:数据库课程设计之AI图库管理系统 最近在带学生做数据库课程设计,发现一个挺有意思的现象:很多同学觉得数据库设计就是建几张表,写几个查询,做完就完了,跟实际应用脱节挺大的…...
效率提升秘籍:用快马AI自动生成技能评估系统的管理后台与评分引擎
今天想和大家分享一个提升开发效率的实用技巧——如何快速搭建技能评估系统的核心模块。最近在做一个叫skill-vetter的项目,发现其中很多功能其实可以通过智能工具自动生成,省去了大量重复编码的时间。 题库管理模块的实现思路 这个模块的核心需求是让…...
Mysql是怎么加锁的?
原文地址https://www.xiaolincoding.com/mysql/lock/how_to_lock.html#%E4%BB%80%E4%B9%88-sql-%E8%AF%AD%E5%8F%A5%E4%BC%9A%E5%8A%A0%E8%A1%8C%E7%BA%A7%E9%94%81 我只是精简一下做个记录 这篇汇总将基于 MySQL 8.0 的 InnoDB 引擎,在 可重复读(Repe…...
