Я работаю над функцией, которая принимает пару массивов JSON и некоторые значения настроек, а затем выполняет сравнение между элементами в массивах. В преддверии этого я пытаюсь проанализировать JSONB в PG / Pl SQL. Эта версия с жестко запрограммированным JSON в теле функции работает:
CREATE OR REPLACE FUNCTION tools.try_unpacking_hard_coded (
base_jsonb_in jsonb)
RETURNS TABLE (
base_text citext,
base_id citext)
AS $BODY$
BEGIN
RETURN QUERY
with
base_expanded AS (
select *
from json_populate_recordset(
null::record,
'[
{"base_text":"Red Large Special","base_id":1},
{"base_text":"Blue Small","base_id":5},
{"base_text":"Green Medium Special","base_id":87}
]')
AS unpacked (base_text citext, base_id citext)
)
select base_expanded.base_text,
base_expanded.base_id
from base_expanded;
END
$BODY$
LANGUAGE plpgsql;
Вот пример вызова и вывода:
select * from try_unpacking_hard_coded('{}'::jsonb);
base_text base_id
Red Large Special 1
Blue Small 5
Green Medium Special 87
Однако, когда я пытаюсь передать текст JSON и анализируя его как параметр, я не получаю ничего, кроме результатов NULL
. Я получаю правильное имя и количество столбцов, а также правильное количество строк ... но без значений.
CREATE OR REPLACE FUNCTION tools.try_unpacking (
base_jsonb_in jsonb)
RETURNS TABLE (
base_text citext,
base_id citext)
AS $BODY$
BEGIN
RETURN QUERY
WITH
base_expanded AS (
select *
from jsonb_populate_recordset(
null::record,
base_jsonb_in)
AS base_unpacked (base_text citext, base_id citext)
)
select base_expanded.base_text,
base_expanded.base_id
from base_expanded;
END
$BODY$
LANGUAGE plpgsql;
Вот вызов:
select * from try_unpacking (
'[{"text":"Red Large Special","id":"1"},
{"text":"Blue Small","id":"5"},
{"text":"Green Medium Special","id":"87"}]'
);
И результат:
base_text base_id
NULL NULL
NULL NULL
NULL NULL
Может ли кто-нибудь указать мне правильное направление, чтобы исправить это?
Продолжение
Барбарос Озхан любезно указал на мою ошибку, вот рабочая версия:
CREATE OR REPLACE FUNCTION tools.try_unpacking (
base_jsonb_in jsonb)
RETURNS TABLE (
base_text citext,
base_id citext)
AS $BODY$
BEGIN
RETURN QUERY
WITH
base_expanded AS (
select *
from jsonb_populate_recordset(
null::record,
base_jsonb_in)
AS base_unpacked (text citext, id citext)
)
select base_expanded.text AS base_text,
base_expanded.id AS base_id
from base_expanded;
END
$BODY$
LANGUAGE plpgsql;
Кстати, причина переименования в том, что теперь у меня будет второй параметр со значениями comparison
.