PostgreSQL: "refcursor"处或附近的语法错误

标签 postgresql ref-cursor multiple-resultsets postgresql-14

当我使用 Microsoft SQL Server 数据库时,有时会从存储过程返回多个结果集。我经常返回太多,以至于很难区分哪个是哪个。为了解决这个问题,我遵循从同事那里学到的约定:第一个结果集是一个“映射”,它定义了第二个结果集和其他结果集的名称。它有一条记录,其中每个字段名称都是结果集的名称,相应的字段值是它在返回的结果集数组中的索引。客户端代码首先通过名称查找索引来访问特定结果集。

下面的简单示例展示了这个想法:

create or alter procedure divide
  @a int,
  @b int
as
begin
  declare
    @error int = 0

  -- Name-to-index map
  select
    1 as result,
    2 as error

  -- Result
  if @b = 0
  begin
    set @error = 1
    select
      null as result
  end
  else
  begin
    select
      @a / @b as result
  end

  -- Error
  select
    @error as error
end

在此示例中,第一个结果集(索引:0)表明还有 2 个结果集:一个称为“结果”(索引:1),另一个称为“错误”(索引:2)。两者都只包含一条记录:分别是除法结果和错误代码。


示例调用#1:

exec divide @a = 91, @b = 13

JSON 格式的结果集:

[
  [{ result: 1, error: 2 }],
  [{ result: 7 }],
  [{ error: 0 }]
]

示例调用#2:

exec divide @a = 91, @b = 0

JSON 格式的结果集:

[
  [{ result: 1, error: 2 }],
  [{ result: null }],
  [{ error: 1 }]
]

我尝试使用官方文档(特别是 this page)将此技术移植到 PostgreSQL 14 。我想出了这个:

create or replace function divide(
  a integer,
  b integer
)
returns setof refcursor
language sql as
$$
  declare
    ref1 refcursor;
    ref2 refcursor;
    ref3 refcursor;
    error int := 0;

  begin
    -- Name-to-index map
    open ref1 for select
      1 as result,
      2 as error;
    return next ref1;

    -- Result
    if b = 0 then
      error := 1;
      open ref2 for select
        null as result;
    else
      open ref2 for select
        a / b as result;
    end if;
    return next ref2;

    -- Error
    open ref3 for select
      error;
    return next ref3;
  end;
$$;

不幸的是,我收到错误:syntax error at or near "refcursor" ,引用refcursordeclare 之后的第一行.

最佳答案

您使用了错误的语言声明。您的过程位于 plpgsql 中,但您通过顶部的 language sql 语句将其声明为纯 sql

更换

create or replace function divide(
  a integer,
  b integer
)
returns setof refcursor
language sql as

create or replace function divide(
  a integer,
  b integer
)
returns setof refcursor
language plpgsql as

解决问题。

关于PostgreSQL: "refcursor"处或附近的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70124117/

相关文章:

json - 如何在 Django 中使用 PostgreSQL 9.2 JSON 数据类型?

php - 直接在 PHP 中访问 psql-array

postgresql - 当我尝试连接到 Postgresql 时出现 panic

c# - 使用来自 Oracle 存储过程的 refcursor 值填充 C# 数据表

oracle - 从 Oracle 函数返回一个引用游标

python - Python 中函数如何返回取决于接收器数量的动态值?

python - 如何将Postgres bytea数据或Python memoryview对象转换为NumPy数组?

oracle - 如何在 Oracle SQL Developer 中查看 refcursor 结果/输出?

java - 在 Java 中是否可以在单个 SQL 查询和结果集中检索不相关数据的表?

java结果集覆盖