2

免責事項:SQLの経験があまりなく、会社で使用しているOracleのバージョンがわかりません。

明日更新する必要のある製品価格表があります。更新されるレコードは数千ありますが、変更されないレコードはさらに数千あります。

現在、すべてのレコードに対して更新ステートメントがあります。これらすべてをスクリプトとして実行できますが、更新されたレコードの数と、可能であればどのステートメントが失敗したかについて、何らかのフィードバックを取得したいと思います。

スクリプトとして持っているものを実行すると、「0行が更新されました」と表示された場合に失敗したメッセージがわからない、約5,000の「1行が更新されました」というメッセージが表示されます。

失敗をキャッチする、または少なくとも更新された行の数を1つの合計に収集する、使用できるスクリプトの形式はありますか?

4

1 に答える 1

5

あなたの製品価格表には、ある種の変更日またはフィールドによって最後に変更された日付がありますか?その場合は、これらを更新していることを確認してください。

また、スクリプトを使用する場合は、エコーをオンに設定し、ログファイルにスプールする必要があります。スクリプトは次のようになります。

-- updates.sql
set serveroutput on
set echo on
WHENEVER SQLERROR EXIT SQL.SQLCODE
spool on
spool updates.log

-- put updates here

commit;
spool off

このファイルと同じディレクトリからsqlplusにログインし、@updates.sqlを使用して実行します。

updates.logファイルには、実行される各ステートメントが含まれます。

個別の更新ステートメントのリストから合計を取得する場合は、更新のたびにSQL%ROWCOUNTを検査する必要があります。(テストされていない)のようなもの:

declare 
  l_total pls_integer := 0;
begin
  update product set x = 'foo' where y='bar';
  l_total := l_total + SQL%ROWCOUNT;

  update product set x = 'blah' where y='someval';
  l_total := l_total + SQL%ROWCOUNT;

  commit;
  dbms_output.put_line(l_total);
end
/

これは基本的なpl/sql匿名ブロックであり、上記のスプール戦略で使用できます。

最後に、メッセージフィールド、ログ日時、いくつかのコンテキストフィールド(メッセージの送信元など)、メッセージのタイプ(ログ、エラー)などを含む基本的なログテーブルを設定するのが一般的です。処理するプロシージャを設定します。ログテーブルに挿入し(自律トランザクション)、統計などを追跡する必要があるときはいつでもログプロシージャを使用します(dbms_outputは非常に制限されています)。あなたの環境にはすでにこのようなものがあるかもしれません、あなたはそれを探す必要があります(またはあなたの会社の上級開発者に尋ねる必要があります)。

于 2012-09-09T00:51:07.610 に答える