запрос не имеет назначения для данных результатов, выберите имена функций из схемы

#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