在数组中追加项不起作用,postgresql不允许使用select

时间:2018-02-07 20:33:59

标签: sql postgresql

我正在使用光标,获取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>

...

1 个答案:

答案 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;