Функция, возвращающая набор столбцов

#postgresql

#PostgreSQL

Вопрос:

Я пытаюсь вернуть схемы всех таблиц, присутствующих в моей схеме / базе данных, но выдает ошибку-

Мой код-

 create or replace function Table_Schema(schemaname text, tablename text) 
 RETURNS SETOF varchar
 as
$body$
declare
  _query varchar;
begin
 _query := 'select * from information_schema.columns WHERE table_name = '''||tablename||''' ';
  RAISE NOTICE '"%"' , _query;

   -- execute and return all
   RETURN QUERY EXECUTE _query;
end;
$body$
language plpgsql;


copy(select  
  Table_Schema(table_schema, table_name)
from information_schema.tables
where 
  table_schema  in ('public')) to 'C:testTable_Schema.csv' DELIMITER ',' CSV HEADER;
  

Не могли бы вы мне помочь? Я думаю, проблема в типе возвращаемого значения. Спасибо

Ответ №1:

Нет необходимости в динамическом SQL или PL / pgSQL.

 create or replace function Table_Schema(schemaname text, tablename text) 
 RETURNS SETOF information_schema.columns
 as
$body$
 select * 
 from information_schema.columns 
 WHERE table_name = tablename
   and table_schema = schemaname;
$body$
language sql;
  

Но для экспорта всех столбцов в файл CSV вам вообще не нужна функция:

 copy (select * from information_schema.columns where table_schema = 'public' order by schema_name, table_name, ordinal_position) to '/path/to/output.csv' with (format csv)
  

Комментарии:

1. Спасибо, понял. Просто небольшая опечатка. Вместо schema_name должно быть table_schema . Не могли бы вы отредактировать его, чтобы я мог принять его в качестве своего ответа?

Ответ №2:

Простой ответ — вернуть setof information_schema.columns .

 create or replace function Table_Schema(schemaname text, tablename text) 
 RETURNS setof information_schema.columns
 as
$body$
declare
  _query varchar;
begin
 _query := 'select * from information_schema.columns WHERE table_name = '''||tablename||''' ';
  RAISE NOTICE '"%"' , _query;

   -- execute and return all
   RETURN QUERY EXECUTE _query;
end;
$body$
language plpgsql;

  

Но ваша функция не имеет особого смысла, потому что вы никогда не используете schemaname переменную, и то же самое может быть достигнуто прямым select запросом.

Комментарии:

1. Понял. Спасибо за ответ