将参数传递给psql过程脚本

时间:2014-06-06 03:14:56

标签: postgresql psql

我在psql上有一个循环命令脚本,如下所示:

script.sql

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收到语法错误,因此我没有想法如何将简单参数传递给此脚本。建议欢迎

1 个答案:

答案 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