postgresql 游标(cursor)的使用
概述
PostgreSQL游标可以封装查询并对其中每一行记录进行单独处理。当我们想对大量结果集进行分批处理时可以使用游标,因为一次性处理可能造成内存溢出。
另外我们可以定义函数返回游标类型变量,这是函数返回大数据集的有效方式,函数调用者根据返回游标对结果进行处理。
下图展示了如何使用PostgreSQL游标:
- 第一步声明游标.
- 接着打开游标.
- 然后从结果中取出行至目标变量中.
- 之后,检查是否有更多的行可以继续取。如何有返回第三步,否则至第五步.
- 最后,关闭游标.
下面章节我们会详细说明每一步。
声明游标
为了访问游标,需要在声明块中声明游标变量。PostgreSQL提供了特定类型REFCURSOR 用于声明游标变量。下面示例声明非绑定游标:
DECLARE
my_cursor REFCURSOR;
另一种方式声明绑定游标变量,及声明时绑定查询语句,语法如下:
cursor_name [ [NO] SCROLL ] CURSOR [( name datatype, name data type, ...)] FOR query;
首先,指定游标变量名称。接着,使用SCROLL指定游标是否可以回滚。如果使用 NO SCROLL,游标不能回滚。然后是CURSOR关键字,其后是逗号分隔的参数列表(name datatype) ,用于定义查询参数。这些参数在游标打开是被替换。之后指定查询在FOR 关键字之后,看使用任何有效的SELECT子句。
首先,指定游标变量名称。接着,使用SCROLL指定游标是否可以回滚。如果使用 NO SCROLL,游标不能回滚。然后是CURSOR关键字,其后是逗号分隔的参数列表(name datatype) ,用于定义查询参数。这些参数在游标打开是被替换。之后指定查询在FOR 关键字之后,看使用任何有效的SELECT子句。
下面示例如何声明游标变量:
DECLARE
cur_films CURSOR FOR SELECT * FROM film;
cur_films2 CURSOR (year integer) FOR SELECT * FROM film WHERE release_year = year;
cur_films是封装film表中所有记录的游标变量。
cur_films2是封装film表中带有特定发行年份记录的游标变量。
绑定游标变量被初始化为字符串值表示其名称(官方文档成为portal name),后续一致不变。但非绑定游标变量初始缺省为null值,所以后期会接受一个自动生成的唯一名称。
当递归函数中定义游标时,需定义为非绑定游标,否则会产生错误:cursor already in use。
## 打开游标
游标在使用之前必须要打开,PostgreSQL提供特定语法用于打开绑定游标和非绑定游标。
打开非绑定游标
打开非绑定游标语法:
OPEN unbound_cursor_variable [ [ NO ] SCROLL ] FOR query;
因为非绑定游标变量在声明时没有绑定任何查询,因此在打开时必须指定查询。请看示例:
OPEN my_cursor FOR SELECT * FROM city WHERE counter = p_country;
PostgreSQL 可以打开游标并绑定至动态查询,语法如下:
OPEN unbound_cursor_variable[ [ NO ] SCROLL ]
FOR EXECUTE query_string [USING expression [, ... ] ];
在下面示例中,我们构建动态查询基于sort_field参数对结果进行排序,然后打开游标并执行动态查询:
query := 'SELECT * FROM city ORDER BY $1';
OPEN cur_city FOR EXECUTE query USING sort_field;
打开绑定游标
因为绑定游标声明时已经绑定了查询,所以打开时,仅需要传入必要参数即可:
OPEN cursor_variable[ (name:=value,name:=value,...)];
下面示例中,打开上节声明的绑定游标cur_films和cur_films2:
OPEN cur_films;
OPEN cur_films2(year:=2005);
使用游标
打开游标之后,可以使用FETCH, MOVE操纵游标,并更新或删除记录。
取下一行记录语法:
FETCH [ direction { FROM | IN } ] cursor_variable INTO target_variable;
fetch语句从游标中获得下一行记录并赋值给目标变量target_variable,可以是record类型或row变量或逗号分隔的变量列表。如果没有发现可取行,目标变量target_variable为null。
如果不显示指定方向,方向缺省为NEXT。可以有下面值:
- NEXT
- LAST
- PRIOR
- FIRST
- ABSOLUTE count
- RELATIVE count
- FORWARD
- BACKWARD
注意,使用SCROLL声明游标可以FORWARD 和 BACKWARD 。请看示例:
FETCH cur_films INTO row_film;
FETCH LAST FROM row_film INTO title, release_year;
移动游标
语法如下:
MOVE [ direction { FROM | IN } ] cursor_variable;
如果仅想移动游标并不返回行,可以使用move语句。方向关键字与FETCH语句一致。
MOVE cur_films2;
MOVE LAST FROM cur_films;
MOVE RELATIVE -1 FROM cur_films;
MOVE FORWARD 3 FROM cur_films;
删除或更新行
一旦游标位置确定,则可以删除或更新行,提供使用DELETE WHERE CURRENT OF 或 UPDATE WHERE CURRENT OF语句:
UPDATE table_name
SET column = value, ...
WHERE CURRENT OF cursor_variable;
DELETE FROM table_name
WHERE CURRENT OF cursor_variable;
请看示例:
UPDATE film SET release_year = p_year
WHERE CURRENT OF cur_films;
关闭游标
关闭游标使用close关键字:
CLOSEC cursor_variable;
close语句释放资源或释放游标变量使其可以被再次打开。
完整示例
下面的示例用于查询fooid为指定值的fooname首先创建表foo:
create table foo (
fooid int,
fooname text
)
插入数据,然后创建实例:
create or replace function get_fooname1(id integer)
returns text as $$
declare
title text default 'fooname ';
f_name record;
cur_fname cursor(id integer)
for select fooname,fooid
from foo
where fooid=id;
begin
open cur_fname(id);
loop
fetch cur_fname into f_name;
exit when not found;
title := title || ':' ||f_name.fooname;
end loop;
close cur_fname;
return title;
end; $$
language plpgsql;
然后使用select语句可以查询:
postgres=# select * from get_fooname1(1);
get_fooname1
--------------
fooname :hi
(1 row)
相关文章:

postgresql 游标(cursor)的使用
概述 PostgreSQL游标可以封装查询并对其中每一行记录进行单独处理。当我们想对大量结果集进行分批处理时可以使用游标,因为一次性处理可能造成内存溢出。 另外我们可以定义函数返回游标类型变量,这是函数返回大数据集的有效方式,函数调用者…...
计算机组成原理——指令系统(六)
在时间的长河中,我们都是追梦人,脚下的每一步都在刻画未来的模样。无论世界如何变幻,心中的那团火焰都不应熄灭。它是你突破黑暗、迎接黎明的力量源泉。每一个不曾起舞的日子,都是对生命的辜负;每一次跌倒后的站起&…...

Python设计模式 - 原型模式
定义 原型模式是一种创建型设计模式,它可以通过复制现有对象来创建新对象,而不是直接实例化新的对象。 结构 抽象原型(Prototype):声明 clone() 方法,以便派生类实现克隆自身的能力。具体原型(…...

金和OA C6 DownLoadBgImage任意文件读取漏洞
金和OA C6 DownLoadBgImage任意文件读取漏洞 漏洞描述 金和C6数据库是一款针对企业信息化管理而设计的高级数据库管理系统,主要应用于企业资源规划(ERP)、客户关系管理(CRM)以及办公自动化(OA)…...

【stm32学习】STM32F103实操primary(FlyMCU)
github插入图片实在是太难用了,暂时懒得学就先用CSDN吧hh 一、在设备管理器下,找到单片机,并检查与FlyMCU-搜索端口 显示的是否一致 二、在搜索串口右面的栏里选中该Port,波特率选中115200 三、选择文件夹中的.hex文件࿰…...

如何将Excel的表格存为图片?
emmm,不知道题主具体的应用场景是什么,就分享几个我一般会用到的场景下奖excel表格保存为图片的技巧吧! 先来个总结: 方法 适用场景 画质 操作难度 截图(WinShiftS) 快速保存表格,方便粘贴…...

51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤
一、Keil uVision5创建工程步骤 1.点击项目,新建 2.新建目录 3.选择目标机器,直接搜索at89c52选择,然后点击OK 4.是否添加起吊文件,一般选择否 5.再新建的项目工程中添加文件 6.选择C文件 7.在C文件中右键,添加…...
AUTOSAR面试题集锦(1)
最基础概念 什么是AUTOSAR?AUTOSAR到底做了什么? AUTOSAR,即汽车开放系统架构,是一套专门用于汽车的开放性的框架和行业标准,旨在标准化汽车开发的流程。 AUTOSAR 通过标准化软件接口、交换格式和方法论等内容,主要实现以下几个目标: 1. 使软件和硬件彼此独立,让应…...

【Uniapp-Vue3】从uniCloud中获取数据
需要先获取数据库对象: let db uniCloud.database(); 获取数据库中数据的方法: db.collection("数据表名称").get(); 所以就可以得到下面的这个模板: let 函数名 async () > { let res await db.collection("数据表名称…...
AIOS: 一个大模型驱动的Multi-Agent操作系统设计与Code分析
AIOS: 一个大模型驱动的Multi-Agent操作系统设计与Code分析 随着人工智能技术的快速发展,传统操作系统逐渐暴露出难以适应AI时代多样化需求的局限性。特别是在支持多个智能体协同工作方面存在显著不足。为此,我们提出了一种名为AIOS(Artifici…...

Python----Python高级(网络编程:网络基础:发展历程,IP地址,MAC地址,域名,端口,子网掩码,网关,URL,DHCP,交换机)
一、网络 早期的计算机程序都是在本机上运行的,数据存储和处理都在同一台机器上完成。随着技术的发展,人 们开始有了让计算机之间相互通信的需求。例如安装在个人计算机上的计算器或记事本应用,其运行环 境仅限于个人计算机内部。这种设置虽然…...

收集的面试资料
转载自:NLP_基于酒店评论的情感分析-CSDN博客 机器学习的一般过程 如何介绍项目: 项目背景:项目输入,输出,后续应用点 项目数据:数据来源 数据处理方法:是否有脏数据,如何处理脏数据…...

pytest-xdist 进行多进程并发测试!
在软件开发过程中,测试是确保代码质量和可靠性的关键步骤。随着项目规模的扩大和复杂性的增加,测试用例的执行效率变得尤为重要。为了加速测试过程,特别是对于一些可以并行执行的测试用 例,pytest-xdist 提供了一种强大的工具&…...

LVGL4种输入设备详解(触摸、键盘、实体按键、编码器)
lvgl有触摸、键盘、实体按键、编码器四种输入设备 先来分析一下这四种输入设备有什么区别 (1)LV_INDEV_TYPE_POINTER 主要用于触摸屏 用到哪个输入设备保留哪个其他的也是,保留触摸屏输入的任务注册,其它几种种输入任务的注册&…...

全流程安装DeepSeek开源模型
目录 配置要求安装Ollama选择大模型安装大模型对话备注 配置要求 我的电脑配置为: CPU:i7 12代 GPU:3080 内存:32g 磁盘:1T以上配置运行情况: 运行ollama run deepseek-r1:7b模型无压力,CPU/…...
人工智能领域-CNN 卷积神经网络 性能调优
在自动驾驶领域,对卷积神经网络(CNN)进行性能调优至关重要,以下从数据处理、模型架构、训练过程、超参数调整和模型部署优化等多个方面为你详细介绍调优方法,并给出相应的代码示例。 1. 数据处理 数据增强࿱…...
人工智能A*算法与CNN结合- CNN 增加卷积层的数量,并对卷积核大小进行调整
以下是一个增强版的将 A* 算法与卷积神经网络(CNN)结合的代码实现,其中 CNN 增加了卷积层的数量,并对卷积核大小进行了调整。整体思路依然是先利用 A* 算法生成训练数据,再用这些数据训练 CNN 模型,最后使用…...
机器学习中常用的评价指标
一、分类任务常用指标 1. 准确率(Accuracy) 定义:正确预测样本数占总样本数的比例。优点:直观易懂,适用于类别平衡的数据。缺点:对类别不平衡数据敏感(如欺诈检测中99%的负样本)。…...

Windows安装cwgo,一直安装的是linux平台的
Windows安装cwgo,一直安装的是linux平台的 查看 go env ,发现 GOOSlinux 临时修改 GOOS ,set GOOSwindows ,再安装。 此时,安装的就是 windows 的可执行文件。安装之后再将 GOOS 修改回来即可。...

GitHub Pages + Jekyll 博客搭建指南(静态网站)
目录 🚀 静态网站及其生成工具指南🌍 什么是静态网站?📌 静态网站的优势⚖️ 静态网站 VS 动态网站 🚀 常见的静态网站生成器对比🛠️ 使用 GitHub Pages Jekyll 搭建个人博客📌 1. 创建 GitHu…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...