2014-01-08 111 views
0

脚本:陷阱ORA错误

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错误,任何提示表明具体的数据库错误将是足够的

谢谢。

+0

我固定的格式设置,但你恢复它。请在代码后删除段落中的缩进。 –

+0

感谢David-SkyMesh – user1502952

回答

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/[email protected]$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 
+0

感谢梅林提到这种方法,真的帮助解决了问题 – user1502952

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