我在 Postgres 8.3 中运行一个 plpgsql 脚本 - 我想通过 psql 将参数传递给这个脚本。我目前正在执行脚本,例如:
psql -d database -u user -f update_file.sql
我遇到了解释 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"
还有其他想法吗?理想情况下,我想避免环境变量...
要为 ... 添加其他功能
-v
如果您尝试添加引号,请在命令行中添加:这将运行以下代码:
一样
尝试
-v
:如果要使用
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 中为每个数据库安装一次:
说到版本:您应该考虑升级到当前版本的 PostgreSQL。v8.3 现在已经很老了,在 2013 年初停止使用。
由于您似乎有一个现成的 SQL 脚本,我将演示一个 SQL 函数。具有两个整数参数的简单虚拟函数:
您可以在 dba.SE或SO上找到许多更复杂的 plpgsql 示例。
您可以调用此函数并在 shell 脚本中提交参数:在 shell 脚本中调用的基本示例,它使用整数参数的输入参数(需要的值周围不需要单引号):
或任何数据类型:
-c
执行一个命令字符串然后退出。更多关于手册中 psql 的命令行参数的信息。根据我的经验,在 plpgsql 声明中取消引用 psql 变量,例如在 CREATE FUNCTION BEGIN 或 DO BEGIN 中会导致语法错误:
我的解决方案是创建一个带有单列的临时表并将值存储在其中。这个临时表可以通过 plpgsql 访问,因此我可以传递在 DO 块中使用的 psql 变量。
要在 CREATE FUNCTION 或 DO 声明中使用额外的 psql 变量,您可以为所需的每个变量创建一个列。
这不是很优雅,但它可以工作(伪代码):
这种方法将为您提供 env vars 的完整运行时分辨率......因此,一旦您的脚本预先设置了下面的所有 shell 变量,它将起作用(已针对不同的 dbs 和主机运行了数千次):