gpt4 book ai didi

linux - 在 shell 脚本中解析 oracle SQLPLUS 错误消息以发送电子邮件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:33 24 4
gpt4 key购买 nike

我正在尝试从 Oracle 错误消息中提取一个子字符串,以便我可以使用 awk 将其通过电子邮件发送给管理员,这部分代码试图找到我想要提取的重要位。

开始这里是我所拥有的......

(表名不正确产生错误)

validate_iwpcount(){

DB_RETURN_VALUE=`sqlplus -s $DB_CRED <<END
SELECT count(COLUMN)
FROM INCORRECT_TABLE NAME;
exit
END`


a="$DB_RETURN_VALUE"
b="ERROR at line"
awk -v a="$a" -v b="$b" 'BEGIN{print index(a,b)}'

echo $DB_RETURN_VALUE

}

奇怪的是,无论 awk 的返回值 $DB_RETURN_VALUE 有多大,它的返回值始终为 28。我假设在此错误消息中的某处有一些 linux 认为是某种隐式定界符并且它与计数或其他东西混淆陌生人。这适用于常规字符串,而不是 oracle 给我的。

有人可以照亮这个吗?

非常感谢

最佳答案

28 似乎是您查询的正确答案(稍作修改以避免 ORA-00936,并在脚本中使用制表符)。您回显的消息包括文件扩展;原始消息是:

        FROM IW_PRODUCTzS
*
ERROR at line 2:
ORA-00942: table or view does not exist

* 在您 echo $DB_RETURN_VALUE 时展开,因此您执行此操作的目录似乎有 logs mail_files scripts它,并且它们通过 * 的扩展显示。如果您从不同的目录运行它,回显 消息的长度会有所不同,但来自 Oracle 的实际消息的长度保持不变 - 在 SQL*Plus 调用和在 awk 完成它的工作之后。您可以使用 echo "$DB_RETURN_VALUE" 来避免这种扩展,尽管我认为您实际上并不希望最终看到完整的消息。

字符 28 的子串给了你想要的:

validate_iwpcount(){

DB_RETURN_VALUE=`sqlplus -s $CENSYS_ORACLE_UID <<END
SELECT count(COLUMN_NAME)
FROM IW_PRODUCTzS;
exit
END`

# To see the original message; note the double-quotes
# echo "$DB_RETURN_VALUE"

a="$DB_RETURN_VALUE"
b="ERROR at line"
p=`awk -v a="$a" -v b="$b" 'BEGIN{print index(a,b)}'`

if [ ${p} -gt 0 ]; then
awk -v a="$a" -v p="$p" 'BEGIN{print substr(a,p)}'
fi

}

validate_iwpcount

... 仅显示:

ERROR at line 2:
ORA-00942: table or view does not exist

我确信这可以简化,也许可以简化为单个 awk 调用,但我对此并不熟悉。

关于linux - 在 shell 脚本中解析 oracle SQLPLUS 错误消息以发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com