在函数内使用 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;
我正在尝试创建一个迭代 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;