#sql #postgresql #function #plpgsql
Вопрос:
Я пытаюсь превратить select в функцию, но продолжаю получать ошибку: «запрос не имеет назначения для данных результатов». Выберите возвращает 5 столбцов, поэтому я пытаюсь вернуть таблицу с 5 столбцами. Я не могу понять, чего мне не хватает, пожалуйста, помогите!
CREATE OR REPLACE FUNCTION docs_getfunctionsindb()
RETURNS TABLE(
a name,
b name,
c text,
d text,
e text) AS
$BODY$
begin
SELECT
n.nspname as "Schema",
p.proname as "Name",
pg_catalog.pg_get_function_result(p.oid) as "Returned data type",
pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
CASE
WHEN p.proisagg THEN 'agg'
WHEN p.proiswindow THEN 'window'
WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
ELSE 'normal'
END as "Type"
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE pg_catalog.pg_function_is_visible(p.oid)
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname = 'public'
and p.proname != 'passgen'
ORDER BY 1, 2, 4;
end ;
$BODY$
LANGUAGE plpgsql VOLATILE
Ответ №1:
Как следует из сообщения об ошибке, вы должны указать функции, что возвращать. Для возврата таблицы на основе запроса используйте RETURN QUERY
, например
CREATE OR REPLACE FUNCTION func()
RETURNS TABLE(val int, txt text) LANGUAGE 'plpgsql'
AS $
BEGIN
-- return columns match the columns declared in RETURNS TABLE
RETURN QUERY SELECT 1,'txt';
END;
$;
И назови это так:
SELECT * FROM func();
val | txt
----- -----
1 | txt
(1 row)
Итак, если предположить, что ваш запрос верен, функция должна выглядеть следующим образом:
CREATE OR REPLACE FUNCTION sip_docs_getfunctionsindb()
RETURNS TABLE(
a name,
b name,
c text,
d text,
e text) AS
$BODY$
begin
RETURN QUERY SELECT
n.nspname as "Schema",
p.proname as "Name",
pg_catalog.pg_get_function_result(p.oid) as "Returned data type",
pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
CASE
WHEN p.proisagg THEN 'agg'
WHEN p.proiswindow THEN 'window'
WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
ELSE 'normal'
END as "Type"
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE pg_catalog.pg_function_is_visible(p.oid)
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname = 'public'
and p.proname != 'passgen'
ORDER BY 1, 2, 4;
end ;
$BODY$
LANGUAGE plpgsql VOLATILE