如何在动态PL / pgSQL语句中运行INSERT ... SELECT?

时间:2019-10-22 14:39:36

标签: json postgresql plpgsql dynamic-sql

我有一个获取PK,动态表名称和JSON的函数。 动态表是较早创建的。 我需要输入此表中接收到的数据,为此,我正在使用EXECUTE FORMAT,但是我不知道如何使用SELECT将所有JSON扔到表中。 JSON有几个对象。

下面是代码示例:

CREATE FUNCTION FUNC_TEST(COD_FK BIGINT,
                              NAME_TABLE TEXT,
                              JSON JSONB)
    RETURNS VOID
    LANGUAGE plpgsql
AS
$$
BEGIN
    EXECUTE FORMAT(
            'INSERT INTO public.%I (
                COD_FK,
                A,
                B,
                C) L%',
            NAME_TABLE,
            (SELECT COD_FK,
                    (SRC ->> 'A') :: TEXT,
                    (SRC ->> 'B') :: BIGINT,
                    (SRC ->> 'C') :: TEXT
             FROM JSONB_ARRAY_ELEMENTS(JSON) SRC));
END
$$;

返回的错误是:

ERROR: subquery must return only one column.

如何执行此插入?

1 个答案:

答案 0 :(得分:0)

子查询应该是动态字符串的一部分:

EXECUTE
   format('INSERT INTO public.%I
              (COD_FK, A, B, C)
           SELECT %s,
                  (SRC ->> 'A') :: TEXT,
                  (SRC ->> 'B') :: BIGINT,
                  (SRC ->> 'C') :: TEXT
           FROM JSONB_ARRAY_ELEMENTS(%L) SRC',
          NAME_TABLE,
          COD_FK,
          JSON);