如何从 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 执行此操作,则必须实际创建一个函数。
我从 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 执行此操作,则必须实际创建一个函数。