首页 > 解决方案 > psql \i 带参数的元命令

问题描述

我有一个 sql 脚本,用于手动检查长时间运行的进程的状态。我的服务器目前是 postgres 10。该脚本包含几十个查询。但是,每个查询都需要当前进程的 id(不是 linux pid,而是 db 中的一列)。

所以,就像

SELECT * FROM table1 WHERE id = 'xxx';
SELECT * FROM table2 WHERE id = 'xxx';
... and so forth

我有一个 sql 脚本,我用最新的 id 不断更新,并运行

db# \i my-script.sql

如果我可以将变量传递到脚本中,那就太好了。例如,也许脚本是

SELECT * FROM table1 WHERE id = '$1';
SELECT * FROM table2 WHERE id = '$1';

我可以跑

db# \i my-script.sql 'xxx'

它会正确地用那个值替换$1sql 脚本中的所有值。多个参数的奖励积分(例如$2等等)。

OTOH,我可以编写一个包装 psql 命令行的 bash 脚本,但我需要放到 shell 中执行它 - 如果我已经在 psql 中,我就在那里。

有什么建议吗?

谢谢!

标签: postgresqlpsql

解决方案


使用psql变量。

在脚本中,写

\prompt 'Please enter id:' myid
SELECT * FROM table1 WHERE id = :'myid';

如果您不想要交互式提示,请省略\prompt并在调用脚本中设置变量:

\set myid 1234

推荐阅读