Oracle unix(HP-UX)shell脚本中的陷阱错误

Oracle unix(HP-UX)shell脚本中的陷阱错误,oracle,shell,unix,Oracle,Shell,Unix,脚本: 我需要捕获任何特定于选择queryi.e的错误。未找到任何数据或存在任何错误 while循环中的记录可能出现特定于数据库的错误,请继续 在读取所有记录结束之前不退出 Oracle版本:10.2.0.5.0 注意:仅获取特定的ORA错误不是强制性的,任何指示特定db错误的提示都足够了 谢谢。文件: while read -r records do sErrors=`sqlplus /<<EOF WHENEVER SQLERROR EXIT SQL.SQLCODE;

脚本:

我需要捕获任何特定于选择queryi.e的错误。未找到任何数据或存在任何错误 while循环中的记录可能出现特定于数据库的错误,请继续 在读取所有记录结束之前不退出

Oracle版本:10.2.0.5.0

注意:仅获取特定的ORA错误不是强制性的,任何指示特定db错误的提示都足够了

谢谢。

文件:

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
脚本:

name1 newname1
name2 newname2
name3 newname3

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

在上述情况下,如果匹配,它将同时打印grep输出和echo命令输出

如果不希望打印输出,可以按照以下步骤操作。 echo$sErrors | grep ORA-ERROR1>/dev/null 2>&1 如果[$?-等式0];然后 找到了回波ORA-ERROR1
fi

我修复了您的格式,但您将其还原。请删除代码后面段落中的缩进。感谢merlin提到这种方法,它确实有助于解决问题
#!/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