Oracle数据库的命令行工具SQL * Plus提供了SPOOL命令以“将查询结果存储在文件中”。 下一个屏幕快照显示了SQL * Plus中使用的SPOOL,用于将用户表列表假脱机到名为C:\pdf\output.txt
。
如该文件的下一个清单所示,已执行的查询和查询的结果都已假脱机到文件output.txt
。
Oracle的SQL * Plus的SPOOL
-ed output.txt
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使用\ o ( \ out ) 元命令提供与SQL * Plus的SPOOL
类似的功能。 以下屏幕快照显示了psql
正在执行的操作。
通过psql
的\o
元命令编写的output.txt
文件显示在下一个清单中。
List of relations
Schema | Name | Type | Owner
--------+--------+-------+----------
public | albums | table | postgres
(1 row)
在生成的output.txt
文件中仅包含在psql
中运行的查询结果。 查询本身,甚至是通过在\set ECHO_HIDDEN on
使用\set ECHO_HIDDEN on
生成的较长查询,都不会包含在输出中。
确保查询本身已输出且查询结果已写入文件的一种方法是使用\qecho
元命令在运行查询之前将查询显式写入假脱机文件。 下一个屏幕快照对此进行了演示。
将\qecho
与\o
结合使用确实会将查询本身与查询结果一起放置在写入的文件中,如下面列出的输出所示。
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
的主要缺点是必须在将每个语句写入输出文件之前使用它。
可以将psql
变量ECHO
设置为queries
以“将所有发送到服务器的SQL命令也发送到标准输出。” 下一个屏幕快照对此进行了演示。
不幸的是,尽管将psql
变量ECHO
设置为queries
会导致查询与psql
窗口中的结果一起输出,但是\o
元命令不会将查询写入文件。 相反,当将\o
与ECHO
设置为ECHO
一起queries
,查询本身将再次打印到窗口中,并且仅将结果写入指定的文件。 这是因为,如文档所述(我强调了 ), \o
元命令将“查询输出 ...写入标准输出”。 下一个屏幕快照对此进行了演示。
我还没有找到一种方法来轻松使用\o
meta-data命令,并且无需使用\qecho
即可将查询及其结果写入文件。 但是,另一种不需要\qecho
是运行,而不是尝试以交互方式假脱机从psql
内部输出文件,而是从外部执行SQL脚本输入文件。
例如,如果我创建一个名为input.sql
的输入文件,该文件仅包含带有查询的一行
select * from albums;
我可以跑步
psql
与命令
psql -U postgres --echo-queries < input.txt > outputWithQuery.txt
读取带有查询的单行文件,并将输出写入outputWithQuery.txt
文件。 --echo-queries
选项的工作方式类似于psql
的\set ECHO queries
,运行此命令可成功生成带有查询和结果的指定输出文件。 下面的屏幕快照和下面的代码清单对此进行了演示。
outputWithQuery.txt
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)
我不知道如何在psql
SQL * Plus内部完全模仿SQL * Plus的查询及其结果,而无需添加\qecho
元命令,而是使用--echo-queries
将输入脚本传递给psql
option的工作方式与在SQL * Plus中调用和假脱机脚本非常相似。
翻译自: https://www.javacodegeeks.com/2016/08/spooling-queries-results-psql.html