发生错误时如何退出sqlplus

问题描述 投票:0回答:2

我想捕获任何可能发生的 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

我为旧表输入了错误的名称,看看会发生什么。我希望只有像我在 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错误代码在哪里?


事实上,不使用 begin...end 并且它可以工作

oracle error-handling sqlplus
2个回答
10
投票

我不确定你在做什么,但这种类型的代码对我来说效果很好。对于第一个例子:

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。以十六进制表示为 0xFFFFFC52。反转该数字的所有位即可得到补码,即 0x3AD。该值加一即可得到二进制补码值,即 0x3AE。它的低位字节是 0xAE,以 10 为基数表示为 174。我对 SQLCODE 值 -904(给出的退出代码为 136)和 -6550(给出的退出代码为 150)重复了此操作。


0
投票
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 ##

现在在您的环境中运行此代码,您将看到它。

© www.soinside.com 2019 - 2024. All rights reserved.