我的脚本使用SQL*Plus error logging来跟踪安装过程中的错误。 脚本以这样的方式开始 - 它们启用erorr日志记录并截断任何现有条目:
SQL> set errorlogging on truncate
SQL> select * from table_does_not_exist;
select * from table_does_not_exist
*
ERROR at line 1:
ORA-00942: table or view does not exist
然后在最后我查询sperrorlog
以查看出现了什么问题:
SQL> select statement from sperrorlog;
STATEMENT
--------------------------------------------------------------------------------
select * from table_does_not_exist
但是偶尔truncate
不起作用,我从以前的安装中得到错误。为什么truncate
无效?
答案 0 :(得分:2)
尽管它的名称,SQL * Plus错误日志记录truncate实际上并没有截断表。它删除数据但不提交。
此SQL * Plus会话启用错误记录并创建错误。另一个启用错误记录和截断的调用确实清除了数据,但回滚撤消了截断。
SQL> set errorlogging on truncate
SQL> select * from table_does_not_exist;
select * from table_does_not_exist
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> commit;
Commit complete.
SQL> set errorlogging on truncate
SQL> select statement from sperrorlog;
no rows selected
SQL> rollback;
Rollback complete.
SQL> select statement from sperrorlog;
STATEMENT
--------------------------------------------------------------------------------
select * from table_does_not_exist
SQL>
为安全起见,您应始终在commit
之后发出set errorlogging on truncate
。
答案 1 :(得分:0)
为安全起见,您应该在truncate
上设置错误记录后立即发出提交
或者,执行显式TRUNCATE ,这会将隐式提交作为DDL语句。当然,这就像不使用truncate
选项一样,但rollback
的问题也是如此。我找到了回滚问题的解决方法,并在我的博客SQL*Plus error logging – workaround for ROLLBACK issue
回到你的问题,我更信任一个明确的截断:
SQL> set errorlogging on
SQL> select * from table_does_not_exist;
select * from table_does_not_exist
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select statement from sperrorlog;
STATEMENT
----------------------------------------
select * from table_does_not_exist
SQL> truncate table sperrorlog;
Table truncated.
SQL> select statement from sperrorlog;
no rows selected
SQL> rollback;
Rollback complete.
SQL> select statement from sperrorlog;
no rows selected
SQL>
或者,您可以对 sperrorlog
表使用全局临时表,并将其设为 on commit delete rows
。