【问题标题】:Passing PostgreSQL psql error messages to unix shell variables将 PostgreSQL psql 错误消息传递给 unix shell 变量
【发布时间】:2014-07-18 09:03:10
【问题描述】:

我正在从 Unix shell 脚本调用 PostgreSQL 函数。

谁能告诉我如何在 unix shell 变量中捕获函数返回的 PostgreSQL 错误消息?

我用了下面的方法,但不能

#!/bin/ksh

function crt_views
{
#Call the POSTGRE pkg which created dynamic views

echo "Calling POSTGRE function FN_CRT_ACTNET_VWS..." >> $LOGFILENAME
pg_msg=`psql --echo-all -U<uname> << EOF
set client_min_messages='NOTICE';
SELECT FUNC_CRT_VWS();
EOF`

}


crt_views
echo "PRINTING - $pg_msg"

在输出中我没有看到 PostgreSQL 函数返回的错误。请帮忙

【问题讨论】:

  • 可接受的名称缩写版本是 Postgres,而不是 POSTGRE

标签: postgresql output ksh psql


【解决方案1】:

您需要将 stderr 重定向到 stdout,因为 backtick 只会让您获得 stdout

这是因为来自RAISE NOTICERAISE EXCEPTION(除其他外)的输出都由psql 打印到stderr

注意:我也从使用 backtick 切换到 dollar-paren 样式执行。使用 backtick,以这种方式重定向 stderr 不起作用。 (我的测试是在 sh 而不是 ksh 下进行的,但我怀疑在这种情况下,行为应该是相似的。)

此外,set -e 将因错误而失败,这可能是可取的(取决于您的需要)。

所以,这导致了这样的事情:

#!/bin/ksh

set -e

function crt_views
{
#Call the Postgres pkg which created dynamic views

echo "Calling Postgres function FN_CRT_ACTNET_VWS..." >> $LOGFILENAME
pg_msg=$(psql --echo-all -U<uname> << EOF
set client_min_messages='NOTICE';
SELECT FUNC_CRT_VWS();
EOF
2>&1)

}


crt_views
echo "PRINTING - $pg_msg"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 2013-03-28
    • 1970-01-01
    • 2013-11-02
    • 2013-05-04
    • 1970-01-01
    • 2011-12-10
    • 2011-12-27
    相关资源
    最近更新 更多