昨天bbs论坛里有网友提到一个有关参数调用问题,这个问题应该很多人遇到过,这里记录下。
网友提的问题
PostgreSQL数据库中,
\i 1.sql
表示执行这个SQL脚本,如何将变量传递给 1.sql 脚本?
备注:这位网友想在 psql 调用 sql 脚本时传递参数到 sql 文件中,这个需求很普通,因为在 shell 脚本执行某些维护工作时非常有用。这时可以使用 psql 的 -v 参数,如下:
测试环境准备
1 | [pg93@redhatB ~]$ psql francs francs |
带变量的 sql 脚本1
2[pg93@redhatB tf]$ cat 1.sql
select * from test_3 where id=:v_id;
测试:psql客户端传递变量
psql 客户端使用 -v 选项传递变更,同时使用 -f 选项执行脚本,如下:1
2
3
4
5
6
7
8
9
10
11[pg93@redhatB tf]$ psql francs francs -v v_id=1 -f 1.sql
id | name
----+------
1 | a
(1 row)
[pg93@redhatB tf]$ psql francs francs -v v_id=2 -f 1.sql
id | name
----+------
2 | b
(1 row)
备注:满足需求。这里通过 -f 直接调用 sql 文件,也可以通过 -c 命令调用 sql 文件,如下:
psql 客户端使用 -v 选项传递变更,同时使用 -c 选项执行脚本,如下:1
2
3
4
5
6
7
8
9
10
11[pg93@redhatB tf]$ psql francs francs -v v_id=1 -c 'i 1.sql'
id | name
----+------
1 | a
(1 row)
[pg93@redhatB tf]$ psql francs francs -v v_id=2 -c 'i 1.sql'
id | name
----+------
2 | b
(1 row)
备注:结果一样,个人建议使用前面的方法。另外,如果是比较复杂的逻辑,建议写在 function 中。