如何从psql查询中将文本打印到stdout?

时间:2016-06-13 22:51:26

标签: postgresql plpgsql

我从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的新手并且调整别人的代码。我无法改变脚本的主要结构,我只需要一些方法来打印一个值。

有人能指出我正确的方向吗?

1 个答案:

答案 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执行此操作,则必须实际创建函数。