我在 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)
尝试-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_setting
andSET
或setval
,您必须附加一行postgresql.conf
以添加选项。
严格来说,没有“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.SE或SO上找到更多关于 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 的命令行参数的更多信息。