我有一个循环命令脚本psql
看起来像这样:
脚本.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
,所以我不知道如何将一个简单的参数传递给这个脚本。欢迎提出建议
可能性很小,如何做。匿名块与客户端环境相对强烈地隔离,因此参数化并不直观 - 但这并不困难。
您可以使用服务器端会话变量。这些变量可以从两个环境访问。
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)