oracle 如何在发生错误时退出sqlplus

jvlzgdj9  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(156)

我想捕捉任何可能发生的SQL错误,所以我在ksh中写道:

$ORACLE_HOME/bin/sqlplus -s u/p <<EOF
    WHENEVER OSERROR EXIT 68;
    WHENEVER SQLERROR EXIT SQL.SQLCODE;

    CREATE TABLE new_table
    AS (SELECT * FROM wrong_old_table);
    COMMIT;
EOF

我给旧table起了一个错误的名字,看看会发生什么。我希望只有像我在WHENEVER SQLERROR中要求的那样才有sqlcode,但我有这个:

AS (SELECT * FROM wrong_old_table)
                      *
 ERROR at line 2:
 ORA-00942: table or view does not exist

我修改了代码:

$ORACLE_HOME/bin/sqlplus -s u/p <<EOF
    WHENEVER OSERROR EXIT 68;
    WHENEVER SQLERROR EXIT SQL.SQLCODE;

    BEGIN
       CREATE TABLE new_table
       AS (SELECT * FROM wrong_old_table);
       COMMIT;
    END;
 EOF

 sql_code=$?

 echo "code=$sql_code"

即使有错误,代码也等于0。SQL错误代码在哪里?
事实上,没有使用开始.结束和它的工作

yizd12fk

yizd12fk1#

我不知道你在做什么,但这种类型的代码对我来说工作得很好。对于第一个示例:

SQL> whenever sqlerror exit sql.sqlcode;
SQL> create table new_table as select * from wrong_old_table;
create table new_table as select * from wrong_old_table
                                        *
ERROR at line 1:
ORA-00942: table or view does not exist

$ echo $?
174

请注意,退出代码并不完全对应于SQLCODE,因为SQLCODE总是负数,而大多数shell中的退出代码被限制为从+0到+255的值;因此,您得到的退出代码似乎是SQLCODE(+)的二进制补码的低位字节。实际上,这意味着您将获得一个可预测和可重复的非零值,但它不会与SQLCODE完全匹配,并且多个SQLCODE值可能会产生相同的退出代码值。
祝你好运
(+)如果您关心:在上面的例子中,SQLCODE是-942。在十六进制中,这是0xFFFFFC 52。反转这个数字的所有位得到一个补码,即0x 3AD。这个值加1得到二的补码值,即0x 3AE。它的低位字节是0xAE,以10为基数是174。我对SQLCODE值-904和-6550重复了这一过程,前者给出的退出代码为136,后者给出的退出代码为150。

ffdz8vbo

ffdz8vbo2#

test.sh

function checkError {
$ORACLE_HOME/bin/sqlplus -s "/ as sysdba" <<EOF
WHENEVER OSERROR EXIT 68;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
select * from dual;

exit
EOF

}

####### MAIN #########

export ORACLE_SID='cat /etc/oratab | grep -v ^''#'' | grep -v ^$ | awk -F ":" ' { print $1 }' | grep -v ASM | uniq'
export ORACLE_HOME='grep $ORACLE_SID /etc/oratab | awk -F: ''{print $2}'''
export PATH=$ORACLE_HOME/bin:$PATH

checkError

exitcode=$?
echo "here is the error status $?"
echo ""
echo ""
echo "Here is the exit code $exitcode"

if [ $exitcode -ne 0 ]
then
echo "There was an issue with checkError. Aborting here..."
exit 3
else
echo "checkError successful.. Proceeding.."
fi

exit 0

## End of Code ##

现在在你的环境中运行这段代码,你会看到它。

相关问题