plpgsql光标在unnest函数上

Posted

技术标签:

【中文标题】plpgsql光标在unnest函数上【英文标题】:plpgsql cursor on unnest function 【发布时间】:2016-02-24 10:25:17 【问题描述】:

我有一个 plpgsql 函数,例如:

DO
$$
DECLARE
  c_id c.id%TYPE;   
  j_text c.j_options%TYPE;
  j_option varchar;
  c1 c%ROWTYPE;

begin
  CREATE TYPE my_row_type AS (c2 TEXT);
  for 
    --c1 in select c.j_options, c.id from c c
    c1 in select * from c
    loop
      c_id = c1.id; 
        for
         c2 in select * from  unnest(string_to_array(c1.j_options,', '))
         loop
        raise notice 'Value: %, %', c_id, c2.j_options;
         end loop;   

    end loop;
END
$$ language plpgsql;

我的问题是这一行:

c2 in select * from  unnest(string_to_array(c1.j_options,', '))

我运行的示例查询,例如:

select unnest(string_to_array('1.0, 1.2',', '));

返回 2 行:

1. 1.0
2. 1.2

我需要遍历这两行,但不确定这个 unnest 语句的返回类型应该是什么,或者它应该如何在声明部分声明。

我在运行脚本时遇到的错误:

ERROR:  loop variable of loop over rows must be a record or row variable or 

list of scalar variables
LINE 18:          c2 in select * from  unnest(string_to_array(c1.j_...

从下面的答案我得到以下错误

ERROR:  function string_to_array(bytea, unknown) does not exist
LINE 1: select from  unnest(string_to_array(c1.j_options,', '))
                            ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
QUERY:  select from  unnest(string_to_array(c1.j_options,', '))

我不明白为什么这在脚本中不起作用。它识别出c1.j_optionsbytea

我修改后的脚本位是:

for c2 in
   select from unnest(string_to_array(c1.j_options,', '))
loop
   raise notice '%', c2;
end loop; 

【问题讨论】:

试试string_to_array(convert_from(c1.j_options, 'utf8'), ', ') 即使使用 utf8 我仍然收到相同的错误消息:( 老实说,这是另一个问题和调查的主题。创建它并为c 表提供DDL。 【参考方案1】:

根据string_to_array 函数签名,它返回文本数组(text[])所以c2 应该是textvarchar

do language plpgsql $$
declare
  c varchar;
begin
  for c in select unnest(string_to_array('1.0, 1.2', ', ')) loop
    raise notice '%', c;
  end loop;
end; $$;

还有一种特殊的循环类型可以直接遍历数组元素:

do language plpgsql $$
declare
  c varchar;
begin
  foreach c in array string_to_array('1.0, 1.2', ', ') loop
    raise notice '%', c;
  end loop;
end; $$;

【讨论】:

尝试了上述方法,但出现了无法识别该功能的错误。请看我上面的更新【参考方案2】:

错误消息是“错误:函数 string_to_array(bytea, unknown) 不存在”。 bytea 类型不是文本,它是二进制值,对于这种类型,函数 string_to_array 没有定义。从 bytea 到文本没有任何默认转换。很难说什么是解决方案,因为 bytea 可以容纳任何东西。如果有一些文本,那么应该使用“文本”类型,而不是 bytea。

【讨论】:

以上是关于plpgsql光标在unnest函数上的主要内容,如果未能解决你的问题,请参考以下文章

Postgres plpgsql JSON 赋值

将数组数组取消嵌套到 plpgsql 中的简单数组

在plpgsql中获取光标

从 plpgsql 中的 FOR 循环切换到基于集合的 SQL 命令

避免在 postgres plpgsql 函数中几乎重复查询

plpgsql 专家:(记录集)函数的输入和输出