Postgresql plpgsql触发器-将动态ID集传递给插入查询(v9.6)

Postgresql plpgsql触发器-将动态ID集传递给插入查询(v9.6),postgresql,triggers,plpgsql,Postgresql,Triggers,Plpgsql,从根本上说,这就是我想要实现的目标 CREATE OR REPLACE FUNCTION transform404activities() RETURNS TRIGGER LANGUAGE plpgsql AS $$ DECLARE get404json text; BEGIN get404json := 'insert into public.events_404_normalized(event_name) select json_data->>''event_

从根本上说,这就是我想要实现的目标

CREATE OR REPLACE FUNCTION transform404activities() RETURNS TRIGGER LANGUAGE plpgsql AS $$
DECLARE
    get404json text;

BEGIN
    get404json := 'insert into public.events_404_normalized(event_name) select json_data->>''event_name'' from public.event_404 WHERE id IN(select id from public.event_404 WHERE created_at < (select now()) AND processed is NULL)';
    EXECUTE format(get404json);
    RETURN NEW;
END
$$;
这很有意义,因为它不是数组

select id from public.event_404 WHERE created_at < (select now()) AND processed is NULL;
 id 
----
 51
 52
 53
 50
(4 rows)
我希望我的变量包含以下内容:

select array_agg(id) from public.event_404 WHERE created_at < (select now()) AND processed is NULL;
   array_agg   
---------------
 {51,52,53,50}
我似乎缺少一些基本的东西,但我尝试执行的所有操作都会导致相同的错误:列result404ids不存在错误

更新 我重新编写了我的触发器,去掉了很多积垢。这与预期的效果一样:

CREATE OR REPLACE FUNCTION transform404activities() RETURNS TRIGGER LANGUAGE plpgsql AS $$
DECLARE
    result404ids text;

BEGIN
    EXECUTE 'select array_agg(id) from public.event_404 WHERE created_at < (select now()) AND processed is NULL' INTO result404ids;
    EXECUTE 'insert into public.events_404_normalized(event_name,language) select json_data->>''event_name'',json_data->>''language'' from event_404 WHERE id = ANY( '|| quote_literal(result404ids) ||')';
    RETURN NEW;
END
$$;
更新2

根据克林的建议,我的最终结果是:

CREATE OR REPLACE FUNCTION transform404activities() RETURNS TRIGGER LANGUAGE plpgsql AS $$
DECLARE
    get404ids text;
    result404ids int ARRAY;
    get404json text;

BEGIN
    EXECUTE 'select array_agg(id) from public.event_404 WHERE created_at < (select now()) AND processed is NULL' INTO result404ids;
    get404json := 'insert into public.events_404_normalized(event_name,language) select json_data->>''event_name'', json_data->>''language'' from public.event_404 WHERE id = ANY ($1)';
    execute get404json using result404ids;
    RETURN NEW;
END
$$;
使用执行。。。使用…:


请参阅文档。

我也会尝试您的方法,也许我可以去掉引号的文字部分。感谢您的建议,我已经用工作代码更新了我的问题。在这种情况下,您不需要动态SQL。移除它。它有很大的开销——触发器的开销更大。
ERROR:  column "result404ids" does not exist
LINE 1: ...event_name' from public.event_404 WHERE id = ANY (result404i...
                                                             ^
QUERY:  insert into public.events_404_normalized(event_name) select json_data->>'event_name' from public.event_404 WHERE id = ANY (result404ids)
CONTEXT:  PL/pgSQL function transform404activities() line 12 at EXECUTE
select array_agg(id) from public.event_404 WHERE created_at < (select now()) AND processed is NULL;
   array_agg   
---------------
 {51,52,53,50}
CREATE OR REPLACE FUNCTION transform404activities() RETURNS TRIGGER LANGUAGE plpgsql AS $$
DECLARE
    result404ids text;

BEGIN
    EXECUTE 'select array_agg(id) from public.event_404 WHERE created_at < (select now()) AND processed is NULL' INTO result404ids;
    EXECUTE 'insert into public.events_404_normalized(event_name,language) select json_data->>''event_name'',json_data->>''language'' from event_404 WHERE id = ANY( '|| quote_literal(result404ids) ||')';
    RETURN NEW;
END
$$;
CREATE OR REPLACE FUNCTION transform404activities() RETURNS TRIGGER LANGUAGE plpgsql AS $$
DECLARE
    get404ids text;
    result404ids int ARRAY;
    get404json text;

BEGIN
    EXECUTE 'select array_agg(id) from public.event_404 WHERE created_at < (select now()) AND processed is NULL' INTO result404ids;
    get404json := 'insert into public.events_404_normalized(event_name,language) select json_data->>''event_name'', json_data->>''language'' from public.event_404 WHERE id = ANY ($1)';
    execute get404json using result404ids;
    RETURN NEW;
END
$$;
...
get404json := 'insert into public.events_404_normalized(event_name) select json_data->>''event_name'' from public.event_404 WHERE id = ANY ($1)';
execute get404json using result404ids;
...