我从bash shell调用了以下(按摩)psql脚本:
foo=$( psql -q -t -R $'\x01' -F $'\x02' \
--variable="title=something" \
--variable="severity=level9" \
--pset='format=unaligned' \
<<'EOF'
SET standard_conforming_strings=on;
SET myvars.title = :title;
SET myvars.severity = :severity;
DO $$
BEGIN
IF EXISTS ( SELECT 1 from my_database
WHERE title=current_setting('myvars.title') \
AND severity=current_setting('myvars.severity') )
THEN
RAISE NOTICE 'Found existing entry';
ELSE
RAISE NOTICE 'Did not find existing entry';
END IF;
END;
$$;
EOF
)
我希望在bash变量“foo”中捕获一些关于查询是否成功的指示。我想我可以在每个RAISE NOTICE语句之后添加某种print / echo / return / any语句,从psql
语句输出0或1,这样就可以在foo
中捕获它以便以后评估在bash脚本中,例如:
foo=$( psql -q -t -R $'\x01' -F $'\x02' \
--variable="title=something" \
--variable="severity=level9" \
--pset='format=unaligned' \
<<'EOF'
SET standard_conforming_strings=on;
SET myvars.title = :title;
SET myvars.severity = :severity;
DO $$
BEGIN
IF EXISTS ( SELECT 1 from my_database
WHERE title=current_setting('myvars.title') \
AND severity=current_setting('myvars.severity') )
THEN
RAISE NOTICE 'Found existing entry';
magical_incantation 1;
ELSE
RAISE NOTICE 'Did not find existing entry';
magical_incantation 0;
END IF;
END;
$$;
EOF
)
我在过去5个小时内一直在阅读psql
文档,但无法弄清楚上面我想象的magical_incantation
的命令/语法。
我是psql的新手并且调整别人的代码。我无法改变脚本的主要结构,我只需要一些方法来打印一个值。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
\echo
在psql中打印到stdout。我认为RAISE NOTICE
会转到stderr。
可以选择一个psql变量然后回显它。基本破产期为How do you use script variables in PostgreSQL?
但是我不确定目前是否有任何方法将查询结果提取到变量中。
假设这不是您要找的答案只是SELECT.
类似于:
SELECT (EXISTS (....))::int;
-- true is 1, false is 0
请注意,从DO
语句无法执行此操作,因此如果需要从plpgsql执行此操作,则必须实际创建函数。