在函数内使用 jsonb_to_recordset 的无效输入语法

Invalid input syntax using jsonb_to_recordset inside a function

我正在尝试创建一个迭代 jsonb 数组的函数,但我遇到了一条奇怪的错误消息,完全阻止了我。这是我的测试用例。

CREATE OR REPLACE
    FUNCTION public.questiontemplate_match_customattributes(
        id int,
        customattributes jsonb
) 
RETURNS boolean LANGUAGE plpgsql AS 
$function$
DECLARE
    group_attrs JSONB;
    attr JSONB;
    attr_name TEXT;
BEGIN
    RAISE NOTICE 'Test 1';
    FOR attr IN (select * from jsonb_to_recordset(customattributes) AS x("name" TEXT, "value" TEXT)) LOOP
        RAISE NOTICE 'Test 2';
    END LOOP;
    RETURN FALSE;
END $function$;


SELECT
    questiontemplate_match_customattributes(
        12,
        jsonb_build_array(
            jsonb_build_object('name', 'pack', 'value', 'box'),
            jsonb_build_object('name', 'brand', 'value', 'pepsi')
        )
    )

当我 运行 上述查询时,我收到以下消息

SQL Error [22P02]: ERROR: invalid input syntax for type json Detail: Token "pack" is invalid. Where: JSON data, line 1: pack PL/pgSQL function questiontemplate_match_customattributes(integer,jsonb) line 8 at FOR over SELECT rows

并且只有 Test 1 出现在我的输出中但是当我 运行

SELECT * FROM jsonb_to_recordset(
    jsonb_build_array(
            jsonb_build_object('name', 'pack', 'value', 'box'),
            jsonb_build_object('name', 'brand', 'value', 'pepsi')
    )
) AS x("name" TEXT, "value" TEXT)

我得到了正确的记录集。有什么建议吗?

版本:Postgres 12.5

环境:Docker

将变量 attr 的类型从 JSONB 更改为 record 或者 - 如果您需要它作为 JSONB - 更改循环查询以生成 JSONB,如下所示。

FOR attr IN select to_jsonb(x) from jsonb_to_recordset(customattributes) AS x("name" TEXT, "value" TEXT) LOOP
   RAISE NOTICE '%', attr;
END LOOP;

顺便说一句,循环查询可以简化为

FOR attr IN select jsonb_array_elements(customattributes) LOOP
   RAISE NOTICE '%', attr;
END LOOP;