将参数传递给 psql

Jmo*_*y38 14 postgresql psql

我在 Postgres 8.3 中运行一个 plpgsql 脚本 - 我想通过 psql 将参数传递给这个脚本。我目前正在执行这样的脚本:

psql -d database -u user -f update_file.sql 
Run Code Online (Sandbox Code Playgroud)

我遇到了这个链接,它解释了 PGOPTIONS 环境变量,但这不适用于“自定义”参数。即我收到一个错误,因为该设置未在 postgres.conf 文件中列出。

-bash-3.2$ export PGOPTIONS='--pretend=true'
-bash-3.2$ psql -d my_db -f update_database.sql
psql: FATAL:  unrecognized configuration parameter "pretend"
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?理想情况下,我想避免环境变量...

小智 7

-v...添加另一个功能如果您尝试添加引用,请将其添加到命令行中:

psql -v action="'drop'"
Run Code Online (Sandbox Code Playgroud)

这将运行以下代码:

select * where :action;
Run Code Online (Sandbox Code Playgroud)

一样

select * where 'drop';
Run Code Online (Sandbox Code Playgroud)


dez*_*zso 5

尝试-v

$ psql -U postgres -v something=\'blah-blah\'
psql (9.1.3)
Type "help" for help.

postgres=# select :something;
 ?column?
----------
 blah-blah
(1 row)
Run Code Online (Sandbox Code Playgroud)

如果您想使用current_settingandSETsetval,您必须附加一行postgresql.conf以添加选项。


Erw*_*ter 5

严格来说,没有“plpgsql 脚本”这样的东西——PL/pgSQL 是 PostgreSQL 的默认过程语言。它要么是一个 SQL 脚本,要么是一个 plpgsql 函数/过程。您的示例似乎表明一个 SQL 脚本。

您可以创建一个(服务器端)plpgsql(或 sql)函数,它接受任意数量的参数。只要参数是 ,它就非常简单values。如果参数包含标识符,它会变得更复杂一些。然后,您必须将 PL/pgSQL 与动态 SQL 和EXECUTE.

PL/pgSQL 默认预安装在 PostgreSQL 9.0 或更高版本中。但是,您必须在 Postgres 8.3 中为每个数据库安装一次:

CREATE LANGUGAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

说到版本:您应该考虑升级到 PostgreSQL 的当前版本。v8.3 现在已经很老了,2013 年初就停产了。

由于您似乎有一个现成的 SQL 脚本,我将演示一个 SQL 函数。带有两个整数参数的简单虚拟函数:

CREATE OR REPLACE FUNCTION func(int, int)
    LANGUAGE sql RETURNS void AS 
$func$
    UPDATE tbl1 SET col1 = $1 WHERE id = $2;
    UPDATE tbl2 SET col1 = $1 WHERE id = $2;
$func$;
Run Code Online (Sandbox Code Playgroud)

您可以在 dba.SESO找到更多关于 plpgsql 的复杂示例。

您可以调用此函数并在 shell 脚本中传递参数:在 shell 脚本中调用的基本示例,该脚本使用整数参数的输入参数(所需值周围没有单引号):

psql mydb -c "SELECT func($1, $2)"
Run Code Online (Sandbox Code Playgroud)

或者使用任何数据类型:

psql mydb -c "SELECT func2('$1'::text, '$2'::numeric)"
Run Code Online (Sandbox Code Playgroud)

-c执行一个命令字符串然后退出。手册中有关psql 的命令行参数的更多信息。