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