我有一个SQL脚本,将用于在数据库中进行更改。出于审计和可追溯性的原因,我希望脚本根据DBNAME和时间戳生成输出文件名。
db_test=> select 'script_output-' || :'DBNAME' || '-' ||
to_char(now(),'yyyymmdd-HH24MISS') || '.txt' as spoolfile;
spoolfile
--------------------------------------------
script_output-db_test-20190718-163936.txt
但是,当我尝试将查询结果分配给\ out运算符时,我得到以下信息
db_test=> \out select 'script_output-' || :'DBNAME' || '-' || to_char(now(),'yyyymmdd-HH24MISS') || '.txt'
\out: extra argument "script_output-" ignored
\out: extra argument "||" ignored
\out: extra argument ":'DBNAME'" ignored
\out: extra argument "||" ignored
\out: extra argument "-" ignored
\out: extra argument "||" ignored
\out: extra argument "to_char(now(),yyyymmdd-HH24MISS)" ignored
\out: extra argument "||" ignored
\out: extra argument ".txt" ignored
实际创建的输出文件名为select
SDV184022L:~ myuser$ ls -la Downloads/DB-Install/sele*
-rw-r--r-- 1 myuser myuser 0B Jul 18 11:42 Downloads/DB-Install/select
基于这些结果和大量搜索,我将假设这是不可能的,那么有人可以通过另一种方法来生成针对输出指令的动态文件名吗?
答案 0 :(得分:0)
您可以通过在其中运行psql
命令来使用psql
变量来存储查询结果。
knayak=# \set v_spoolfile `psql -A -t -c "select 'script_output-' || current_database() || '-' ||to_char(now(),'yyyymmdd-HH24MISS') || '.txt' as spoolfile" yourdbname`
knayak=# \echo :v_spoolfile
script_output-knayak-20190718-225537.txt
knayak=# \out :v_spoolfile
答案 1 :(得分:0)
由查询生成的结果可以使用\gset
传递到psql中的自动实例化变量。变量的名称是列的名称。试试
db_test=> select 'script_output-' || :'DBNAME' || '-' ||
to_char(now(),'yyyymmdd-HH24MISS') || '.txt' as spoolfile
\gset
那你就可以做
db_test=> \out :spoolfile
请注意,该变量是通过“宏”扩展来处理的。因此,如果:spoolfile
的值恰好包含空格或反斜杠,则psql会将其解释为好像是在命令行中输入的一样。