我有一个调用 SQL 文件的 shell 脚本。但是,即使使用AUTOCOMMIT OFF
and on SQLERROR EXIT ROLLBACK
。Sqlplus 也无法回滚。
我的 sql 文件有 3 行,其中 3 行正确,1 行错误。例如:
INSERT INTO TEST_ROUTING VALUES (24, 'ROUTING');
INSERT INTO TEST_ROUTING VALUES (25, 'ROUTING');
INSERT INTO TEST_ROUTING VALUES (26, 'ROUTING);
我的 shell 脚本调用此 SQL 如下:
$SQLPLUS_PATH/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
connect $DB_USER/$Password1@$Database1
AUTOCOMMIT OFF
@$File1
WHENEVER SQLERROR EXIT ROLLBACK;
EOF
if [ $? != 0 ]; then
echo "The SQL failed. Please refer to the log for more information "
echo "Error code $?"
echo "8. Outside While "
while read LINE; do
-------
done
fi
但这永远不会回滚这 3 条语句。它提交了 2 条语句并在最后一行给出错误。
答案1
WHENEVER SQLERROR 部分应该在实际执行 INSERT 语句之前出现(+ AUTOCOMMIT 之前缺少 SET):
$SQLPLUS_PATH/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
connect $DB_USER/$Password1@$Database1
SET AUTOCOMMIT OFF
WHENEVER SQLERROR EXIT ROLLBACK;
@$File1
EOF