我正在尝试在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时,我收到错误a 但不是在log_file而是在屏幕上
ERROR at line 1: ORA-00904: "E"."FIRS_NAME": invalid identifier
请让我知道如何解决这个问题。
答案 0 :(得分:2)
您可以使用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错误代码并不是一个好主意,例如,因为你可能会得到一个真正的错误,最终在它之后结束为零#39;已被改造。使用rollback
意味着如果在脚本中途发生故障,它将回滚已经进行的任何(未提交的)更改。
这将捕获SQL错误和PL / SQL错误(除非这些错误由异常处理程序捕获而不是重新引发),但不会捕获SQL * Plus特定的错误 - 即那些以{{1}开头的错误},例如来自无效的SP-
命令。
我在set
命令中添加了-l
标志,因此它只尝试连接一次,这对非交互式脚本很有用 - 有时它们可以挂起等待后续凭据,取决于上下文以及脚本中的其他内容。我还修复了sqlplus
的拼写,并添加了一个缺少的反引号...