linux - 从 shell 脚本内部记录 sql 错误

标签 linux oracle unix

我正在尝试在 shell 脚本中实现错误日志记录机制,这也会在 sql 语句中给出错误

我计划从另一个脚本中调用我的脚本并将错误重定向到日志文件。 还有更好的选择吗?请帮忙。

#!/bin/sh

./test.sh 2>&1 >> log_1.log

test.sh包含以下代码

## testing error logging in sql

result=`sqlplus -s $username/$passwd@$db <<EOF
set serveroutout on
set pagesize 0
set heading off
set echo off
set feedback off
select first_name from employees;
exit;
EOF
if [ $? -ne 0 ]; then
   echo "Error exists"
else
echo "$result"
fi

--- 在测试 Alex Pool 给出的代码后编辑

我做了更改,但每当我收到 SQL 错误时,都不会生成日志文件,而是在命令行中显示错误。

脚本名称-test_error_log.sh

#!/bin/sh

output=`sqlplus -s -l hr/hr@xe << EOF
whenever sqlerror exit failure rollback
whenever oserror exit failure rollback
set serveroutput on
set heading off
set pagesize 0
set echo off

select **e.firs_name   --- wrong field name**
       ,d.department_name from 
employees e , departments d
where e.department_id=d.department_id ;

exit;
EOF`

echo $output

我通过以下方式从 caller_shell.sh 调用它

脚本名称:caller_shell.sh

#!/bin/sh

./test_error_log.sh 2>&1 log_file

当我从命令行执行 ./caller_shell.sh 时,我收到错误 但不是在 log_file 而是在屏幕

ERROR at line 1: ORA-00904: "E"."FIRS_NAME": invalid identifier

请告诉我如何解决这个问题..

最佳答案

您可以使用whenever sqlerror使 SQL*Plus 退出并返回错误代码,shell 脚本会将其视为返回代码:

result=`sqlplus -l -s $username/$passwd@$db <<EOF
whenever sqlerror exit failure rollback
whenever oserror exit failure rollback
set serveroutput on
set pagesize 0
set heading off
set echo off
set feedback off
select first_name from employees;
exit 0;
EOF`

当发现错误时它将退出,并且在失败点之后不会尝试任何操作。使用 failure 使其成为通用失败代码,但如果您愿意,也可以指定特定值。但如果您使用自己的值,请注意 shell 限制;在大多数 shell 中,任何高于 255 的值都会循环回零,因此尝试使用 SQL 错误代码退出并不是一个好主意,因为您可能会收到一个真正的错误,该错误在修改后恰好最终为零。使用回滚意味着如果脚本中途发生故障,它将回滚任何已进行的(未提交的)更改。

这将捕获 SQL 错误和 PL/SQL 错误(除非这些错误被异常处理程序捕获并且不会重新引发),但不会捕获 SQL*Plus 特定的错误 - 即那些以 SP-< 开头的错误,例如来自无效的 set 命令。

我在 sqlplus 命令中添加了一个 -l 标志,因此它只尝试连接一次,这对于非交互式脚本很有帮助 - 有时它们可​​以挂起等待后续凭据,具体取决于上下文以及脚本中的其他内容。我还修复了 serveroutput 的拼写并添加了缺失的反引号...

关于linux - 从 shell 脚本内部记录 sql 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118266/

相关文章:

sql - 无法在报告中计算平均天数?

sql - oracle中如何设置查看 View 的权限?

linux - 是否可以通过核心转储定期保存程序状态?

c - 为什么当我用记事本创建 Makefile 时,它​​保存的是 .txt

.net - ODAC 11.2 Release 3 (11.2.0.2.1) 中的 ODP.NET 已经支持 Entity Framework (EF)?

c - 复制字符串时出现段错误

c - fork() 的行为在此示例中不明确

linux - 通过带有 gzip 命令的 shell 脚本在 tomcat 服务器中备份日志文件

linux - 如何根据 'sys_seek' 计算 'sys_read'?

c++ - 找不到 boost 库