如何从 psql 查询将文本打印到标准输出?

How can I print text to stdout from a psql query?

我从 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/whatever 语句,以从 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 的 command/syntax。

我是 psql 的新手,正在调整别人的代码。我无法更改脚本的主要结构,我只需要一些方法来打印一个值。

谁能指出我正确的方向?

\echo 打印到 psql 中的标准输出。我认为 RAISE NOTICE 转到 stderr。

可以 select 到一个 psql 变量然后回显它。基本的 运行-down 位于 How do you use script variables in PostgreSQL?

但是我目前不确定有什么方法可以将查询结果拉入变量。

假设这不是您正在寻找的答案只是 SELECT.

所以像这样:

SELECT (EXISTS (....))::int;
-- true is 1, false is 0

请注意,无法从 DO 语句执行此操作,因此如果您需要从 plpgsql 执行此操作,则必须实际创建一个函数。