vol*_*ron 79 postgresql parameters
我在使用?
占位符的脚本中有一个详细的查询.我想直接从psql命令行(脚本外部)测试这个相同的查询.我想避免进入并用?
实际值替换所有值,而是想在查询后传递参数.
例:
SELECT *
FROM foobar
WHERE foo = ?
AND bar = ?
OR baz = ? ;
Run Code Online (Sandbox Code Playgroud)
寻找类似的东西:
%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
Run Code Online (Sandbox Code Playgroud)
Gav*_*vin 160
你可以使用-v构造例如
psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'"
Run Code Online (Sandbox Code Playgroud)
然后将sql中的变量称为:v1,:v2等
select * from table_1 where id = :v1;
Run Code Online (Sandbox Code Playgroud)
vol*_*ron 27
在PostgreSQL中找到,你可以像脚本语言一样使用PREPARE
语句.不幸的是,你仍然无法使用?
,但你可以使用$n
符号.
PREPARE foo(text,text,text) AS
SELECT *
FROM foobar
WHERE foo = $1
AND bar = $2
OR baz = $3 ;
EXECUTE foo('foo','bar','baz');
DEALLOCATE foo;
Run Code Online (Sandbox Code Playgroud)
wil*_*ser 11
在psql中有一个通过的机制
\set name val
Run Code Online (Sandbox Code Playgroud)
命令,应该与-v name=val
命令行选项绑定.引用很痛苦.在大多数情况下,将整个查询内容放在shell文件中更容易.
哎呀,我应该说-v
而不是-P
(这是格式化选项)以前的回复是正确的.
您还可以在psql命令行或批处理文件中传递参数.第一个语句收集连接到数据库的必要详细信息.
最后的提示要求输入约束值,这些值将在WHERE列IN()子句中使用.请记住单引号if字符串,并用逗号分隔:
@echo off
echo "Test for Passing Params to PGSQL"
SET server=localhost
SET /P server="Server [%server%]: "
SET database=amedatamodel
SET /P database="Database [%database%]: "
SET port=5432
SET /P port="Port [%port%]: "
SET username=postgres
SET /P username="Username [%username%]: "
SET /P bunos="Enter multiple constraint values for IN clause [%constraints%]: "
ECHO you typed %constraints%
PAUSE
REM pause
"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h %server% -U %username% -d %database% -p %port% -e -v v1=%constraints% -f test.sql
Run Code Online (Sandbox Code Playgroud)
现在,在您的SQL代码文件中,在WHERE子句中或SQL中的任何其他位置添加v1标记.请注意,标记也可以在打开的SQL语句中使用,而不仅仅在文件中使用.将其保存为test.sql:
SELECT * FROM myTable
WHERE NOT someColumn IN (:v1);
Run Code Online (Sandbox Code Playgroud)
在Windows中,将整个文件保存为DOS BATch文件(.bat),将test.sql保存在同一目录中,然后启动批处理文件.
感谢EnterpriseDB的Dave Page,提供原始提示脚本.