发生错误时如何退出sqlplus
How to exit sqlplus when error happens
我想捕获任何可能发生的 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 中询问的那样获得 sql 代码,但我有这个:
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 并且有效
我不确定你在做什么,但这种类型的代码对我来说工作得很好。对于您的第一个示例:
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 的退出代码。
我想捕获任何可能发生的 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 中询问的那样获得 sql 代码,但我有这个:
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 并且有效
我不确定你在做什么,但这种类型的代码对我来说工作得很好。对于您的第一个示例:
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 的退出代码。