PostgreSQL:如何传递参数到 SQL 脚本?

昨天bbs论坛里有网友提到一个有关参数调用问题,这个问题应该很多人遇到过,这里记录下。

网友提的问题

PostgreSQL数据库中,/i 1.sql 表示执行这个SQL脚本,如何将变量传递给 1.sql 脚本?

备注:这位网友想在 psql 调用 sql 脚本时传递参数到 sql 文件中,这个需求很普通,因为在 shell 脚本执行某些维护工作时非常有用。这时可以使用 psql 的 -v 参数,如下:

测试环境准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[pg93@redhatB ~]$ psql francs francs
psql (9.3beta1)
Type "help" for help.

francs=> create table test_3(id int4,name varchar(32));
CREATE TABLE

francs=> insert into test_3 values (1,'a'),(2,'b'),(3,'c');
INSERT 0 3

francs=> select * from test_3;
id | name
----+------
1 | a
2 | b
3 | c
(3 rows)

带变量的 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 中。

参考

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/237974.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论