#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. Понял. Спасибо за ответ