我想捕捉任何可能发生的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错误代码在哪里?
事实上,没有使用开始.结束和它的工作
2条答案
按热度按时间yizd12fk1#
我不知道你在做什么,但这种类型的代码对我来说工作得很好。对于第一个示例:
请注意,退出代码并不完全对应于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。
ffdz8vbo2#
现在在你的环境中运行这段代码,你会看到它。