我正在使用光标,获取10个项目的一列'email1'表'pepe_emails'。 在循环内部,我尝试追加在数组中提取的内容。如果我写'select array_append(arr_emails,table_record :: varchar);'出现此消息:
ERROR: la consulta no tiene un destino para los datos de resultado
HINT: Si quiere descartar los resultados de un SELECT, utilice PERFORM.
如果我按照建议使用perform,则该项不会附加到数组中。这是我当前和失败的代码:
do $$
declare
cursor_emails cursor for
select pepe_emails.email1
from pepe_emails;
arr_emails varchar[];
table_record record;
i integer := 0;
begin
raise notice 'Hola 1';
open cursor_emails;
loop
raise notice 'Loop %', i;
i = i + 1;
fetch cursor_emails into table_record;
raise notice 'Value: %', table_record;
perform array_append (arr_emails, table_record::varchar);
raise notice 'Value: %', arr_emails[-1];
exit when not found;
end loop;
close cursor_emails;
end;
$$;
这是代码的输出:
NOTICE: Value: <NULL>
NOTICE: Loop 1
NOTICE: Value: (us_2.gmail.com)
NOTICE: Value: <NULL>
NOTICE: Loop 2
NOTICE: Value: (us_3.gmail.com)
NOTICE: Value: <NULL>
...
答案 0 :(得分:0)
您需要访问记录的字段,然后执行简单的分配。无需perform
:
arr_emails := arr_emails || table_record.email1;
根据`email1'列的类型,您可能需要将其强制转换为text:
arr_emails := arr_emails || table_record.email1::text;
您没有看到任何结果,因为该变量已初始化为null
,任何涉及null
的表达式都会返回null。所以你需要用一个空数组初始化变量:
declare
....
arr_emails text[] := '{}';
然而,你可以摆脱整个功能,只需使用:
select array_agg(email1)
from pepe_emails;