在unix(HP-UX)shell脚本中捕获ORA错误

时间:2014-01-08 05:00:55

标签: oracle shell unix

脚本:

while read -r records
do
sErrors=`sqlplus /<<EOF
     WHENEVER SQLERROR EXIT SQL.SQLCODE; 
     select id from table where name='"$records"';
     #if select succeeds then update
     update table set name='xyz';
     exit;
     EOF`

     if [[ $sErrors = "ORAsomenumber" ]] 
     then
         echo "Failed for $records with error:$sErrors">>logfile.log
     fi

done<file

我需要捕获特定于选择查询的任何错误(即“无数据发现”)或任何
while循环中记录可能发生的数据库特定错误并继续 没有退出直到阅读所有记录结束

Oracle版本:10.2.0.5.0

注意:不必仅获取特定的ORA错误,任何指示特定db错误的提示都足够

感谢。

2 个答案:

答案 0 :(得分:1)

文件:

name1 newname1
name2 newname2
name3 newname3

脚本:

#!/bin/sh

#set var
export ORACLE_HOME=/oracle/product/db_1/
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH

ora_user="user"
ora_pwd="password"
ora_tns="dbtnsname"
log_file=/var/log/sql.log

while read user newname
do
sqlplus -S $ora_user/$ora_pwd@$ora_tns <<EOF  >>$log_file
    SET SERVEROUTPUT ON
    DECLARE V_ID INT DEFAULT 0;
    BEGIN
      SELECT ID INTO V_ID FROM TABLE WHERE NAME = "$user";
      IF V_ID = 0 OR V_ID  IS NULL
      THEN
         DBMS_OUTPUT.PUT_LINE("FAILED FOR $user WITH ERROR:NOT DATA FOUND");
      ELSE
        UPDATE TABLE SET NAME="$newname" WHERE NAME = "$user";
        COMMIT;
      END IF;

    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE("FAILED FOR $USER WITH ERROR:"||SQLERRM);
    END;
/
EOF   #must top grid
done<file

答案 1 :(得分:0)

sqlplus在脚本中调用的方式很好,但是如果要检查某些特定错误代码(或)字符串的某些部分,使用grep命令,则字符串比较不起作用,因为它包含整个错误。
echo $sErrors | grep "ORA-ERROR1" && echo "ORA-ERROR1 Found"
echo $sErrors | grep "ORA-ERROR2" && echo "ORA-ERROR2 Found"

在上面的例子中,如果匹配,它会输出grep输出和echo命令输出。

如果您不想打印输出,可以按照以下步骤进行操作 echo $sErrors | grep "ORA-ERROR1" > /dev/null 2>&1
if [ $? -eq 0 ];then
echo "ORA-ERROR1 Found"
fi