2015-07-19 3 views
1

Я хочу создать пользовательскую переменную (строку), которая содержит данные из разных таблиц. Я не могу сделать это в одном запросе (специальный заказ для хранения и динамические столбцы).plpgsql, как сохранить переменную в файл

Есть ли способ сохранить переменную в файл?

Или используя командную строку для сохранения результата одной переменной в файл?

+0

Вы хотите экспортировать и сохранить результат запроса в файл? Просьба уточнить. – Spidey

+0

Nimesh, Edited. –

+0

И «командная строка» должна быть оболочкой? Или psql? И как plpgsql входит в это? Пожалуйста, уточните свой вопрос, покажите код, который у вас есть (даже если он не работает) и добавьте свою версию Postgres (как всегда). –

ответ

3

Из-за тега plpgsql Я предполагаю, что вы выполняете некоторые запросы внутри функции plpgsql, а результат, сохраненный в переменной, должен быть отправлен в файл.

В простой SQL вы можете сохранить текст в файле с помощью команды copy, что-то вроде этого:

copy (select 'some text') to 'c:\data\sample.txt'; 

В функции plpgsql вы должны использовать execute команду, чтобы выбрать значение переменной, например:

create or replace function copy_some_text_to_file(filename text) 
returns void language plpgsql 
as $$ 
declare 
    var text:= 'some text'; 
begin 
    execute format($fmt$ 
     copy (select '%s') to '%s' 
     $fmt$, var, filename); 
end $$; 

select copy_some_text_to_file('c:\data\sample.txt') 

Если вы хотите сохранить в файл переменного с многострочной строкой, вы можете использовать regexp_split_to_table():

create or replace function copy_some_text_to_file(filename text) 
returns void language plpgsql 
as $$ 
declare 
    var text:= 'first line\nsecond line\nthird line'; 
begin 
    execute format($fmt$ 
     copy (select regexp_split_to_table(e'%s', e'\n')) to '%s' 
     $fmt$, var, filename); 
end $$; 

Обратите внимание, что строка не может содержать одиночный кавычек, который должен быть правильно экранирован. Хотя в первой версии вы можете заменить '%s' на %L (как предложил Эрвин), вы не можете сделать это во второй версии.

Подробнее:

+2

Должен быть формат ('$ fmt $ copy (выберите% L) в% L $ fmt $, var, filename);' чтобы правильно избежать литералов. Например: http://stackoverflow.com/a/16991854/939860 –

+0

Спасибо, есть способ сломать линию, используя ваш скрипт? Я уже пробовал E '', \ n –

1

Выполнение SQL из Linux оболочки вы можете легко перенаправить результат в файл:

[email protected]:~$ psql mydb --tuples-only -c 'select 1' > /path/to/myfile.txt 

Или Exec Ют SQL для файла:

[email protected]:~$ psql mydb -t -f /path/to/myscript.sql > /path/to/myfile.txt 

Или изнутри PSQL:

\o /path/to/myfile.txt 
\t 
SELECT 1; 
\o 

Все объясняется в the manual for psql.

Смежные вопросы