2

私のスクリプトでは、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

次に、最後にクエリを実行sperrorlogして、何が問題なのかを確認します。

SQL> select statement from sperrorlog;

STATEMENT
--------------------------------------------------------------------------------
select * from table_does_not_exist

しかし、ときどき がtruncate機能せず、以前のインストールでエラーが発生します。なぜ機能しないtruncateのですか?

4

2 に答える 2

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

于 2013-06-08T22:16:46.247 に答える
0

安全のために、truncate で errorlogging を設定した直後にコミットを発行する必要があります。

または、DDL ステートメントである暗黙的なコミットを行う明示的な TRUNCATEを実行します。もちろん、これはオプションを使用しないのと同じですが、. ロールバックの問題の回避策を見つけ、ブログで共有しましたSQL*Plus エラー ログ - ROLLBACK の問題の回避策truncaterollback

あなたの問題に戻って、私は明示的な切り捨てをより信頼しています:

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

于 2015-04-07T06:20:21.230 に答える