SQL * Plus , инструмент командной строки базы данных Oracle , предоставляет команду SPOOL для «сохранения результатов запроса в файле». На следующем снимке экрана показан SPOOL, используемый в SQL * Plus для буферизации списка пользовательских таблиц в файл с именем C:\pdf\output.txt
.
И выполненный запрос, и результаты запроса были output.txt
в файл output.txt
как показано в следующем листинге этого файла.
SPOOL
вывод файла Oracle * Plus в SPOOL
SPOOL
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
SQL> select table_name from user_tables; TABLE_NAME ------------------------------ REGIONS LOCATIONS DEPARTMENTS JOBS EMPLOYEES JOB_HISTORY PEOPLE NUMERAL NUMBER_EXAMPLE COUNTRIES 10 rows selected. SQL> spool off |
Инструмент командной строки PostgreSQL , psql , обеспечивает функциональность, аналогичную SPOOL
в SQL * Plus, с мета-командой \ o ( \ out ). Следующий снимок экрана показывает это в действии в psql
.
Файл output.txt
записанный с помощью output.txt
\o
psql
‘, показан в следующем листинге.
1
2
3
4
5
|
List of relations Schema | Name | Type | Owner --------+--------+-------+---------- public | albums | table | postgres ( 1 row) |
Только сгенерированные в psql
результаты запроса содержатся в сгенерированном файле output.txt
. Сам запрос, даже более длинный запрос, созданный с помощью \set ECHO_HIDDEN on
, не содержится в выводе.
Один из подходов к обеспечению того, чтобы сам запрос выводился с записью результатов запроса в файл, — это использование \qecho
для явной записи запроса в буферный файл перед выполнением запроса. Это продемонстрировано на следующем снимке экрана.
Использование \qecho
вместе с \o
помещает сам запрос в записанный файл с результатами запроса, как показано в следующем списке результатов.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
select * from albums; title | artist | year ---------------------------+-----------------+------ Back in Black | AC/DC | 1980 Slippery When Wet | Bon Jovi | 1986 Third Stage | Boston | 1986 Hysteria | Def Leppard | 1987 Some Great Reward | Depeche Mode | 1984 Violator | Depeche Mode | 1990 Brothers in Arms | Dire Straits | 1985 Rio | Duran Duran | 1982 Hotel California | Eagles | 1976 Rumours | Fleetwood Mac | 1977 Kick | INXS | 1987 Appetite for Destruction | Guns N' Roses | 1987 Thriller | Michael Jackson | 1982 Welcome to the Real World | Mr. Mister | 1985 Never Mind | Nirvana | 1991 Please | Pet Shop Boys | 1986 The Dark Side of the Moon | Pink Floyd | 1973 Look Sharp! | Roxette | 1988 Songs from the Big Chair | Tears for Fears | 1985 Synchronicity | The Police | 1983 Into the Gap | Thompson Twins | 1984 The Joshua Tree | U2 | 1987 1984 | Van Halen | 1984 (23 rows ) |
Основным недостатком использования \qecho
является то, что он должен использоваться перед \qecho
каждого оператора в выходной файл.
Переменная psql
ECHO
может быть настроена на queries
чтобы «все команды SQL отправлялись на сервер [отправлялись] также на стандартный вывод». Это продемонстрировано на следующем снимке экрана.
К сожалению, хотя установка переменной psql
ECHO
для queries
приводит к выводу запроса вместе с результатами в окне psql
, запрос не записывается в файл с помощью \o
. Вместо этого, когда \o
используется с ECHO
установленным на queries
, сам запрос снова распечатывается в окне, а результаты записываются только в указанный файл. Это связано с тем, что, как указано в документации (я добавил акцент ), \o
записывает « вывод запроса… в стандартный вывод». Это продемонстрировано на следующем снимке экрана.
Я не смог найти способ легко использовать команду метаданных \o
и записать запрос и результаты в файл, не используя \qecho
. Тем не менее, другой подход, который не требует \qecho
состоит в том, чтобы запустить не пытаться \qecho
вывод файла изнутри psql
интерактивном режиме, а вместо этого выполнить внешний входной файл сценария SQL.
Например, если я сделаю входной файл с именем input.sql
который состоит только из одной строки с запросом
select * from albums;
Я мог бежать
psql
с командой
psql -U postgres --echo-queries < input.txt > outputWithQuery.txt
для чтения этого однострочного файла с запросом и записи выходных данных в файл outputWithQuery.txt
. Опция --echo-queries
работает как --echo-queries
\set ECHO queries
из psql
и при выполнении этой команды успешно генерируется заданный выходной файл с запросом и результатами. Следующий снимок экрана и следующий список кода демонстрируют это.
outputWithQuery.txt
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
select * from albums; title | artist | year ---------------------------+-----------------+------ Back in Black | AC/DC | 1980 Slippery When Wet | Bon Jovi | 1986 Third Stage | Boston | 1986 Hysteria | Def Leppard | 1987 Some Great Reward | Depeche Mode | 1984 Violator | Depeche Mode | 1990 Brothers in Arms | Dire Straits | 1985 Rio | Duran Duran | 1982 Hotel California | Eagles | 1976 Rumours | Fleetwood Mac | 1977 Kick | INXS | 1987 Appetite for Destruction | Guns N' Roses | 1987 Thriller | Michael Jackson | 1982 Welcome to the Real World | Mr. Mister | 1985 Never Mind | Nirvana | 1991 Please | Pet Shop Boys | 1986 The Dark Side of the Moon | Pink Floyd | 1973 Look Sharp! | Roxette | 1988 Songs from the Big Chair | Tears for Fears | 1985 Synchronicity | The Police | 1983 Into the Gap | Thompson Twins | 1984 The Joshua Tree | U2 | 1987 1984 | Van Halen | 1984 (23 rows ) |
Я не знаю, как точно имитировать написание SQL * Plus запроса с его результатами из SQL * Plus в psql
не добавляя \qecho
, но передавая входной скрипт в psql
с помощью --echo-queries
Опция работает очень похоже на вызов и буферизацию скрипта из SQL * Plus.
Ссылка: | SPOOLing Запросы с результатами в psql от нашего партнера JCG Дастина Маркса в блоге Inspired by Actual Events . |