PosgtreSQL过程

问题描述

我是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 =分区索引