我正在尝试从 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/