Хочу написать функцию, которая принимает два параметра: объект jsonb и ключ, который нужно из него извлечь. Для теста написал такую реализацию, но не понятно, почему l_result возвращает null:
DO
$$
DECLARE
l_json jsonb := '{"entityId":12}'::jsonb;
l_key TEXT := 'entityId';
l_cmd TEXT := 'SELECT ($1 ->> $2)::int;';
l_result int;
BEGIN
RAISE NOTICE 'CMD -> %', l_cmd;
EXECUTE l_cmd INTO l_result USING l_json, quote_literal(l_key);
RAISE NOTICE 'JSON -> %', l_result;
END;
$$
То есть я конечно могу спарсить в самой функции:
BEGIN
l_pascal_name := (p_obj ->> 'pascalName');
l_public_name := (p_obj ->> 'publicName');
l_is_doc := (p_obj ->> 'isDocument')::boolean;
EXCEPTION WHEN OTHERS THEN
RAISE EXCEPTION 'Parsing error: %', SQLERRM;
END;
Но мне нужны подробные ошибки в случае неудачи. Поэтому хочу вызывать что-то вроде:
BEGIN
l_public_name := parse_text_required(p_json, 'entityId');
END;
И проблема в том, что я не понимаю, как внутри parse_text_required сгенерировать код, который извлекал бы entityId из p_json