问题描述
我是postgres函数的新手。我的要求是在postgres数据库中特定模式中存在的每个表上运行一个函数,但是我遇到了一个问题,因为每次函数调用时该函数仅返回一条记录,而我的查询应返回“ n”个记录对于每个表,函数都会调用。嗯,可能会令人困惑-请参阅代码-
create or replace function name_list(schema text,tablename text)
returns text
as $body$
declare
result text;
query text;
begin
query := 'SELECT "names" FROM ' || schema || '.' || tablename;
RAISE NOTICE '"%"',query;
execute query into result;
return result;
end;
$body$
language plpgsql;
copy(select
table_name,name_list(table_schema,table_name)
from information_schema.tables) to 'C:\test\name_list.csv' DELIMITER ',' CSV HEADER;
我很少阅读诸如set of,loop之类的东西,并试图执行,但还是没有运气。任何帮助将不胜感激。
解决方法
您的函数必须是set-seting
create or replace function name_list(schemaname text,tablename text)
-- function will return a set
RETURNS SETOF text
language 'plpgsql'
as $body$
declare
_query text;
begin
-- correct way to format the dynamic sql
_query := FORMAT('SELECT "names" FROM %I.%I;',schemaname,tablename);
RAISE NOTICE '"%"',_query;
-- execute and return all
RETURN QUERY EXECUTE _query;
end;
$body$;
,
information_schema.tables
可能无法完全满足您的期望。 The manual:
视图
tables
包含当前数据库中定义的所有表和视图。仅显示当前用户有权访问的那些表和视图(通过成为所有者或具有某些特权)。
请参阅:
此查询可能会满足您的要求:
SELECT quote_ident(n.nspname) AS schema -- identifiers quoted where necessary,quote_ident(c.relname) AS table,(SELECT string_agg(quote_ident(a.attname),',' ORDER BY a.attnum) AS column_list
FROM pg_catalog.pg_attribute a
WHERE a.attrelid = c.oid
AND a.attnum > 0
AND NOT a.attisdropped) AS column_list -- all columns in physical order
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'public' -- only public schema (?)
AND c.relkind = 'r' -- only plain tables (?)
ORDER BY n.nspname,c.relname;
结果如下:
schema | table | column_list
------ +-----------------+---------------------------------------------
public | foo | id,bar
public | spatial_ref_sys | srid,auth_name,auth_srid,srtext,proj4text
public | "weird TaBlE" | "ID","user","dumb name"
db 提琴here
这仅返回普通表。您可能要包括更多种类。 The manual about pg_class.relkind
:
r
=普通表,i
=索引,S
=序列,t
= TOAST表,v
=视图,m
=实例化视图,c
=复合类型,f
= 外部表,p
=分区表,I
=分区索引