PostgreSQL 中基于游标的记录 [英] Cursor based records in PostgreSQL

查看:45
本文介绍了PostgreSQL 中基于游标的记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将游标用于连接多个表的查询.我已经看到对于 oracle 有一个基于游标的记录.当我为 Postgres 尝试同样的方法时,它会引发一些错误.我如何在 Postgres 中做同样的事情?

创建或替换函数avoidable_states()返回 SETOF varchar AS$BODY$宣布xyz CURSOR FOR select * from address ad在 ad.city_id = ct.city_id 上加入 city ct;xyz_row 记录;开始打开 xyz;环形将 xyz 提取到 xyz_row 中;xyz_row = null 时退出;如果 xyz_row.city 像 '%hi%' 那么返回下一个 xyz_row.city;万一;结束循环;关闭 xyz;结尾;$BODY$语言 plpgsql 易失性;

我得到的错误是:

<块引用>

错误:关系xyz"不存在上下文:第 4 行附近的 PL/pgSQL 函数avoidable_states"的编译

解决方案

只需使用 RECORD 类型:

DECLARE...cur_row 记录;开始...FETCH xyz INTO cur_row;找不到时退出;IF cur_row.city LIKE 'CH%' THEN...

I'm trying to use cursors for a query that joins multiple tables. I've seen that for oracle there is a cursor based record. When I try the same for Postgres, it throws some error. How can I do the same in Postgres?

CREATE OR REPLACE FUNCTION avoidable_states()
RETURNS SETOF varchar AS
$BODY$
DECLARE
    xyz CURSOR FOR select * from address ad
                            join city ct on ad.city_id = ct.city_id;    
    xyz_row RECORD;
BEGIN   
    open xyz;

    LOOP
    fetch xyz into xyz_row;
        exit when xyz_row = null;
        if xyz_row.city like '%hi%' then
            return next xyz_row.city;               
        end if;
    END LOOP;
    close xyz;  
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

Error I get is:

ERROR:  relation "xyz" does not exist
CONTEXT:  compilation of PL/pgSQL function "avoidable_states" near line 4

解决方案

Just use the RECORD type:

DECLARE
    ...
    cur_row RECORD;
BEGIN
    ...
    FETCH xyz INTO cur_row;
    EXIT WHEN NOT FOUND;
    IF cur_row.city LIKE 'CH%' THEN
        ...

这篇关于PostgreSQL 中基于游标的记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆