查询没有结果数据的目的地,select 函数名称来自模式

query has no destination for result data, select functions names from schema

我正在尝试将 select 转换为函数,但不断收到错误消息:“查询没有结果数据的目的地”。 Select returns 5 列所以我试图 return table 有 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

如错误消息所示,您必须告诉函数要 return 的内容。要 return table 基于查询使用 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