2014-01-08 5 views
0

Сценарий:ошибки Trap ORA в UNIX (HP-UX) оболочки сценария

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 

мне нужно зажать какую-либо ошибку, специфичную для выбора запроса (т.е. «НАЙДЕНО НЕТ ДАННЫХ») или какой-либо конкретной ошибки
базы данных, что может произойти для записи в время цикла и продолжают без выхода до конца читать все рекорды версии

Oracle: 10.2.0.5.0

Внимание: это не является обязательной для того, чтобы получить конкретную ошибку ORA только, любой подсказку, указывающую, что определенная ошибка db будет достаточно

Спасибо.

+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"

В приведенном выше случае, он выводит как выход ГРЭП и вывода команды эхо, если оно соответствует.

Если вы не хотите, чтобы выход печатался, вы можете следовать ниже.
echo $sErrors | grep "ORA-ERROR1" > /dev/null 2>&1
if [ $? -eq 0 ];then
echo "ORA-ERROR1 Found"
fi

Смежные вопросы