我在psql
上有一个循环命令脚本,如下所示:
DO $$DECLARE
data_rec RECORD;
r RECORD;
r2 RECORD;
BEGIN
select mytables.data_id into data_rec from mytables where id = :arg1;
FOR r IN select * from
(select * from ...)
LOOP
FOR r2 IN select * from
(...)
LOOP
......
END LOOP;
END LOOP;
END$$;
我想从命令行传递arg1
作为参数:
psql -h db.server.com -f script.sql -v arg1=1234 > foo.out
但我一直在where id = :arg1
收到语法错误,因此我没有想法如何将简单参数传递给此脚本。建议欢迎
答案 0 :(得分:2)
几乎没有可能,怎么做。匿名块与客户端环境相对隔离,因此参数化并不直观 - 但这并不困难。
您可以使用服务器端会话变量。可以从两种环境访问这些变量。
postgres=# \set txt Ahoj
postgres=# set myvars.txt to :'txt'; -- fill server side variable
SET
postgres=# do $$ begin raise notice '%', current_setting('myvars.txt'); end;$$;
NOTICE: Ahoj
DO
稍微复杂的例子
bash-4.1$ cat test.sh
echo "
set myvars.msgcount TO :'msgcount';
DO \$\$
BEGIN
FOR i IN 1..current_setting('myvars.msgcount')::int LOOP
RAISE NOTICE 'Hello';
END LOOP;
END \$\$" | psql postgres -v msgcount=$1
bash-4.1$ sh test.sh 10
SET
Time: 0.935 ms
NOTICE: Hello
NOTICE: Hello
NOTICE: Hello
NOTICE: Hello
NOTICE: Hello
NOTICE: Hello
NOTICE: Hello
NOTICE: Hello
NOTICE: Hello
NOTICE: Hello
DO
Time: 1.709 ms