1つの行に障害が発生した場合は、値のすべてのエラーをエラーログに記録します

データの整合性を維持し、エラーをエラーテーブルに記録しようとしています。一意の制約を持つ3つのテーブルと1つのエラーテーブルがあります。

create table tbl_one ( 
pass_no number, 
constraint tbl_one_u01 unique (pass_no) );
insert into tbl_one values(10);
insert into tbl_one values(20);

create table tbl_two ( 
cus_no number, 
cus_name varchar2(50), 
pass_no number,
constraint tbl_two_u01 unique (cus_no) );
insert into tbl_two values( 101, 'NameX',10);
insert into tbl_two values( 102, 'NameY',10);
insert into tbl_two values( 103, 'NameZ',20);

create table tbl_target (
cus_no number,
pass_no number,
constraint tbl_target_u01 unique (cus_no),
constraint tbl_target_u02 unique (pass_no));

exec dbms_errlog.create_error_log('tbl_target','tbl_target_err');

次のtbl_target_errように、すべてのORA-00001エラーをエラーテーブルに記録しようとしています

begin
    insert into tbl_target
    select a.pass_no, b.cus_no
      from tbl_one a 
     inner join tbl_two b on b.pass_no = a.pass_no
       log errors into tbl_target_err reject limit 10;
end;

結果は次のとおりです。

select * from tbl_target;
-------------------
CUS_NO    PASS_NO
101    10
103    20

およびエラーテーブル:

CUS_NO    PASS_NO
102    10

エラーテーブルに入るには、違反したすべてのエラーが必要です。pass_no 10の値に違反した場合は、10個のすべてをエラーテーブルに挿入する必要があります。1つはターゲットに、もう1つはエラーテーブルに。違反したすべての値をログに記録できないため、existsステートメントを使用したくありません。

どうすればこれを行うことができますか?

アレックスプール

これをサポートするように設計されていないため、これにエラーログメカニズムを使用することはできません。テーブルに重複を作成しようとした時点でエラーが発生します(pass_no10に対して挿入しようとする最初の値はそれ自体で有効です)。そのため、既存のデータと挿入からの複数の値を区別する必要があります。皮切りに。だからあなたはあなた自身を転がす必要があるでしょう。

1つのオプションは、重複を保持する独自のテーブルを作成し、を使用insert allして各テーブルに属する値を決定することです。

create table tbl_target_dup (
cus_no number,
pass_no number
);

insert all
when cus_count = 1 and pass_count = 1 then
  into tbl_target values (cus_no, pass_no)
else
  into tbl_target_dup values (cus_no, pass_no)
select a.pass_no, b.cus_no,
  count(*) over (partition by a.pass_no) as pass_count,
  count(*) over (partition by b.cus_no) as cus_count
from tbl_one a 
join tbl_two b on b.pass_no = a.pass_no;

これにより、PK / UKの影響を受ける列よりも多くの列を作成し、必要に応じて実際のテーブルにのみ挿入するか、「エラー」テーブルにサブセットを挿入できます。各テーブルにこれらの2つの列があるだけで、次のようになります。

select * from tbl_target;

    CUS_NO    PASS_NO
---------- ----------
       103         20 

select * from tbl_target_dup;

    CUS_NO    PASS_NO
---------- ----------
       101         10 
       102         10 

SQLFiddleデモ

同じに基づく2つの挿入で同じことを行うことができますselect。一方は、両方のカウントが1であることをチェックするサブクエリを使用し、もう一方は、少なくとも1つがそうでないことをチェックしますが、これはパフォーマンスが向上する可能性があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

1つのモジュールに障害が発生した場合、MavenForceは続行します

分類Dev

apt-getを介してプログラムをインストールしようとすると、このエラーが発生するのはなぜですか?'archive.ubuntu.com'の解決に一時的な障害が発生しました

分類Dev

django RESTフレームワークで500エラーが発生した場合、すべてのリクエストとレスポンスをログに記録するにはどうすればよいですか?

分類Dev

Ansibleロールバック:ホストの1つに障害が発生した場合でも、ホストのリストに対してタスクのグループを実行します

分類Dev

スレッドの1つに障害が発生した場合、マルチスレッドプログラムで終了コードはどのように決定されますか?

分類Dev

Linuxカーネルの実行中にハードドライブに障害が発生した場合はどうなりますか?

分類Dev

Flurryエラーログの場合、ログに記録した情報はどこにありますか?

分類Dev

log4jを使用してJavaでエラーが発生した場合、ログレベルのonyをログに記録することは可能ですか?

分類Dev

特定のエンドポイントでエラーが発生した場合、ペイロードをログに記録しない

分類Dev

2つの積を合計しようとしたときにエラーが発生しました。1つの積は1x2行列です。

分類Dev

SmtpAppenderを使用して、エラーまたは致命的なログを記録する場合にのみ電子メールを送信する

分類Dev

「ForEachxInarr」が1つのエントリしかない場合に障害が発生する

分類Dev

Pythonでエラーが発生した場合は、すべてのスレッドを終了します

分類Dev

コンテナの1つに障害が発生した場合、SSISパッケージは失敗しますか

分類Dev

RAID0に障害が発生した場合でも、すべてのファイル/フォルダー名を表示できますか?

分類Dev

スクリプトで赤いエラーが発生した場合にのみイベントログをログに記録するにはどうすればよいですか?

分類Dev

2つのテーブルが1つの関数に同時に挿入されている場合、実行時にエラーが発生します

分類Dev

データベースに障害が発生した場合にのみファイルにログインしますか?

分類Dev

エラーが発生しない場合に複数の結果を連鎖させた成功値、またはエラーが発生した場合に別の値を返すにはどうすればよいですか?

分類Dev

Jmeter-1つのサンプラーに障害が発生した場合、残りのサンプラーをスキップすることは可能ですか?

分類Dev

新しいハードドライブでの非特定のカーネルエラー、ドライブに障害が発生していますか?

分類Dev

前の部分に障害が発生した場合、パイプラインの後の部分の実行を停止できますか?

分類Dev

Spring MVC:リソースが見つからない場合でも、すべてのリクエストをログに記録します

分類Dev

コンストラクターの障害が発生した場合、どのようなクリーンアップを行う必要がありますか?

分類Dev

JSONの解析中に、エラーが発生した場合にGoプログラムが停止するのを回避します

分類Dev

エラーが実際に発生した場合にのみ、Python エラー (stderr) をログ ファイルに保存する方法は?

分類Dev

例外が発生した場合は、httpリクエスト本文をログに記録します

分類Dev

(Android)すべてのログインフィールドでエラーが発生しない場合にのみボタンを有効にする

分類Dev

Jmeter:スクリプトの記録中にエラーが発生します

Related 関連記事

  1. 1

    1つのモジュールに障害が発生した場合、MavenForceは続行します

  2. 2

    apt-getを介してプログラムをインストールしようとすると、このエラーが発生するのはなぜですか?'archive.ubuntu.com'の解決に一時的な障害が発生しました

  3. 3

    django RESTフレームワークで500エラーが発生した場合、すべてのリクエストとレスポンスをログに記録するにはどうすればよいですか?

  4. 4

    Ansibleロールバック:ホストの1つに障害が発生した場合でも、ホストのリストに対してタスクのグループを実行します

  5. 5

    スレッドの1つに障害が発生した場合、マルチスレッドプログラムで終了コードはどのように決定されますか?

  6. 6

    Linuxカーネルの実行中にハードドライブに障害が発生した場合はどうなりますか?

  7. 7

    Flurryエラーログの場合、ログに記録した情報はどこにありますか?

  8. 8

    log4jを使用してJavaでエラーが発生した場合、ログレベルのonyをログに記録することは可能ですか?

  9. 9

    特定のエンドポイントでエラーが発生した場合、ペイロードをログに記録しない

  10. 10

    2つの積を合計しようとしたときにエラーが発生しました。1つの積は1x2行列です。

  11. 11

    SmtpAppenderを使用して、エラーまたは致命的なログを記録する場合にのみ電子メールを送信する

  12. 12

    「ForEachxInarr」が1つのエントリしかない場合に障害が発生する

  13. 13

    Pythonでエラーが発生した場合は、すべてのスレッドを終了します

  14. 14

    コンテナの1つに障害が発生した場合、SSISパッケージは失敗しますか

  15. 15

    RAID0に障害が発生した場合でも、すべてのファイル/フォルダー名を表示できますか?

  16. 16

    スクリプトで赤いエラーが発生した場合にのみイベントログをログに記録するにはどうすればよいですか?

  17. 17

    2つのテーブルが1つの関数に同時に挿入されている場合、実行時にエラーが発生します

  18. 18

    データベースに障害が発生した場合にのみファイルにログインしますか?

  19. 19

    エラーが発生しない場合に複数の結果を連鎖させた成功値、またはエラーが発生した場合に別の値を返すにはどうすればよいですか?

  20. 20

    Jmeter-1つのサンプラーに障害が発生した場合、残りのサンプラーをスキップすることは可能ですか?

  21. 21

    新しいハードドライブでの非特定のカーネルエラー、ドライブに障害が発生していますか?

  22. 22

    前の部分に障害が発生した場合、パイプラインの後の部分の実行を停止できますか?

  23. 23

    Spring MVC:リソースが見つからない場合でも、すべてのリクエストをログに記録します

  24. 24

    コンストラクターの障害が発生した場合、どのようなクリーンアップを行う必要がありますか?

  25. 25

    JSONの解析中に、エラーが発生した場合にGoプログラムが停止するのを回避します

  26. 26

    エラーが実際に発生した場合にのみ、Python エラー (stderr) をログ ファイルに保存する方法は?

  27. 27

    例外が発生した場合は、httpリクエスト本文をログに記録します

  28. 28

    (Android)すべてのログインフィールドでエラーが発生しない場合にのみボタンを有効にする

  29. 29

    Jmeter:スクリプトの記録中にエラーが発生します

ホットタグ

アーカイブ