查询没有结果数据的目的地,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
我正在尝试将 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