首页 > 其他分享 >PG游标的使用(转)

PG游标的使用(转)

时间:2022-08-19 23:55:25浏览次数:83  
标签:cur -- 游标 geometry PG 使用 films film

游标介绍:游标是一种从表中检索数据并进行操作的灵活手段,游标主要用在服务器上,处理由客户端发送给服务端的sql语句,或是批处理、存储过程、触发器中的数据处理请求。

​ 游标的优点在于它允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力。缺点是处理大数据量时,效率低下,占用内存大。一般来说,能使用其他方式处理数据时,最好不要使用游标,除非是当你使用while循环,子查询,临时表,表变量,自建函数或其他方式都无法处理某种操作的时候,再考虑使用游标。

​ 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。游标的一个常见用途就是保存查询结果,以便以后使用。游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。

​ PostgreSQL游标可以封装查询并对其中每一行记录进行单独处理。当我们想对大量结果集进行分批处理时可以使用游标,因为一次性处理可能造成内存溢出。另外我们可以定义函数返回游标类型变量,这是函数返回大数据集的有效方式,函数调用者根据返回游标对结果进行处理。

img

  游标使用顺序:声明游标 > 打开游标 > 使用游标 > 关闭游标 。

  先展示一个游标的示例,以下get_film_titles(integer)函数接受代表电影发行年份的参数。在函数内部,我们查询所有发行年份等于传递给该函数的发行年份的电影。我们使用光标在各行之间循环,并连接标题和标题包含ful 单词的电影发行年份。

CREATE OR REPLACE FUNCTION get_film_titles(p_year INTEGER)
   RETURNS text AS $$
-- 声明游标
DECLARE 
 titles TEXT DEFAULT '';
 rec_film   RECORD;
 cur_films CURSOR(p_year INTEGER) FOR SELECT * FROM film WHERE release_year = p_year;
BEGIN
   -- 打开游标
   OPEN cur_films(p_year);
 
   LOOP
    -- 获取记录放入film
      FETCH cur_films INTO rec_film;
    -- exit when no more row to fetch
      EXIT WHEN NOT FOUND;
 
    -- 构建输出
      IF rec_film.title LIKE '%ful%' THEN 
         titles := titles || ',' || rec_film.title || ':' || rec_film.release_year;
      END IF;
   END LOOP;
  
   -- 关闭游标
   CLOSE cur_films;
 
   RETURN titles;
END; $$
 
LANGUAGE plpgsql;

SELECT get_film_titles(2006);

--返回结果 ,Grosse Wonderful:2006,Day Unfaithful:2006,Reap Unfaithful:2006,Unfaithful Kill:2006,Wonderful Drop:2006

一、声明游标

  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语句。

示例:

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表特定发行年份的记录。

二、打开游标

   PostgreSQL提供了用于打开未绑定和绑定的游标的语法。

  1.打开未绑定的游标

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;

  2.打开绑定的游标

 因为绑定游标在声明时已经绑定到查询,所以当我们打开它时,只需要在必要时将参数传递给查询。
OPEN cursor_variable[ (name:=value,name:=value,...)];
-- 在下面的示例中,我们打开了绑定游标,cur_films并cur_films2在上面声明了该游标:
OPEN cur_films;
OPEN cur_films2(year:=2005);

三、使用游标

  使用FETCH,MOVE,UPDATE或DELETE语句操作游标。

 1.获取下一行

FETCH [ direction { FROM | IN } ] cursor_variable INTO target_variable;
该FETCH语句从游标中获取下一行,并为其分配一个target_variable,它可以是记录,行变量或逗号分隔的变量列表。如果找不到更多行,则将target_variable其设置为NULL(s)。

  如果不显示指定方向,方向缺省为NEXT。可以有下面值:

  • NEXT
  • LAST
  • PRIOR
  • FIRST
  • ABSOLUTE count
  • RELATIVE count
  • FORWARD
  • BACKWARD

  请注意,FORWARD和BACKWARD方向仅适用于用SCROLL option 声明的游标。

  示例:

FETCH cur_films INTO row_film;
FETCH LAST FROM row_film INTO title, release_year;

  2.移动光标

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;

  3.删除和更新行

  使用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关闭打开的游标,CLOSE语句释放资源或释放游标变量,以允许使用该OPEN语句再次打开它。

CLOSE cursor_variable;

五、其他

-- 临时表返回结果例子
BEGIN;
DO $$
    DECLARE
        temp_geometry st_geometry;  
        geometry_record RECORD;
        cur_geometry CURSOR FOR SELECT shape as shape FROM mainbasin;
    BEGIN
        OPEN cur_geometry;
        FETCH cur_geometry INTO temp_geometry;
        LOOP
            FETCH cur_geometry INTO geometry_record;
            EXIT WHEN NOT FOUND;
            temp_geometry := st_union(temp_geometry,geometry_record.shape);
        END LOOP;
        CLOSE cur_geometry;

        DROP TABLE IF EXISTS temp_table;
        CREATE TEMP TABLE temp_table AS 
        SELECT st_envelope(temp_geometry) shape;
    END; 
$$;
COMMIT;
SELECT st_astext(shape) FROM temp_table;

原文地址: https://www.cnblogs.com/kerwincui/p/9122108.html

标签:cur,--,游标,geometry,PG,使用,films,film
From: https://www.cnblogs.com/hypj/p/16606934.html

相关文章

  • kubernetes的HPA控制器使用
    安装metricsserver      MetricsServer是Kubernetes内置的容器资源指标来源。      MetricsServer从node节点上的Kubelet收集资源指标,并通过MetricsA......
  • 百度秒传链接的使用方法(电脑版)
    百度秒传链接的使用方法(电脑版)什么是秒传:秒传并不是什么高级的新下载器,而是百度网盘的一个插件工具,是大佬制作的,为了跳过度盘分享检测机制的玩意——文件短时间被分享......
  • 如何使用 RSA 加密 JWT
    引入nimbus-jose-jwt<dependency><groupId>com.nimbusds</groupId><artifactId>nimbus-jose-jwt</artifactId><version>9.23</version></depend......
  • 上古卷轴5卡任务使用控制台强制完成
    网上搜了一圈全是复制粘贴的一个方式,由于使用了整合MOD整合了很多任务包,sqt这种获取原版任务的命令没用。害得去外网。方法如下:首先~进入控制台,输入如下命令并回车save......
  • 华为云桌面使用时的高清程度
    ​ 政企数字化浪潮袭来,从PC时代到虚拟化时代再到如今的云原生时代,云办公已是大势所趋。远程办公、视频会议、数据共享、在线教育、在线医疗、在线政务等逐渐普及,办公的场......
  • Tomcat 服务器学习和使用(一)
    原文:JavaWeb学习总结(二)——Tomcat服务器学习和使用(一)一、Tomcat服务器端口的配置Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件......
  • 2022-08-19 记录一下 奥睿科 2.5/3.5英寸双盘位USB3.0硬盘底座 使用感受
    什么?电脑识别不了硬盘???我把京东客服给骂了,再到我写这个随笔的时候,有点心疼那个京东客服。为了扩容,昨天入手了希捷的2t机械家用盘,以及这次的主角奥睿科硬盘底座,简称硬盘盒......
  • lvgl8.3移植arduino-以esp32为例 lvgl库里例程的使用(踩坑记录)
    这次实验使用最新的lvgl,目前是8.3.1  依旧是先配置好espi,确保显示正常,并运行TFT_eSPI库中的Generic->Touch_calibrate示例获得屏幕触摸数据添加lvlg库 ,最好也......
  • Power BI 中使用 SAP BW 连接器
    在Power BI上使用SAP BW,需要SAP连接器的Implementation2.0。只有有效的S用户才能访问下载。请与SAPBasis团队联系以获取SAP.NET连接器3.0。微软官网推荐......
  • 使用PowerPoint优雅地更改证件照底色
    使用PowerPoint优雅地更改证件照底色首先我们打开一张空白的演示文稿,并将要修改的证件照进行粘贴。(图片来自窝窝摄影,侵删)选中图片,点击格式,再点击删除背景。......