• ベストアンサー

エラーを起こす方法

初心者です。バッチプログラムの単体テストで、異常ケースでエラーを起こさせたいのですが、どのように実行したらいいのかわからず困っています。プログラムの内容は、Aテーブルのデータを全件、同じ構造をしたBテーブルに登録するというものです。ユニークキーのデータを追加して一意制約エラーをおこすにも、そもそもAテーブルにユニークキーのデータを追加して登録することができないと思うのですが、どのようにやるのですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.3

 前後の処理があるとは思いますが、もし、コピー前にBテープルのデータを削除しているなら、いったんその処理だけ止めておきます。コメントアウトするも良し、デバッグモードを組み込んでおくもよし。  Bテーブルに事前にAテーブルにあるデータとユニークキーが同じデータを一つ登録しておきます。  後は、プログラムを実行してみればOK。  Aテーブルの内容を事前にBテーブルにコピーしておいても可ですが、途中でエラーになった時の挙動の確認が出来なくなるかな。まぁ、エラーになった時の処理内容によりますが。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • kamoz
  • ベストアンサー率22% (2/9)
回答No.2

社内SEをしています。 私なら、Aテーブルを2回読み込みます。 それなら、重複キーでOMITされるんじゃないでしょうか?

tohiyu
質問者

お礼

ありがとうございます。 説明が足りなくてすみません。読み込み前にBテーブルを初期化していました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

Bテーブルに、例外を生成するトリガーを張っちゃうとか。 しかし、そもそも起こりえない条件なら、机上チェックで良いんじゃない?

tohiyu
質問者

お礼

ありがとうございます。 例外を生成するトリガーを張るというのが、私には難しくてちょっとよくわかりませんで・・・。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • バッチでINSRT文実行すると一制約エラー、会話型で実行するとエラーに

    バッチでINSRT文実行すると一制約エラー、会話型で実行するとエラーにならない。 すみませんが、教えて頂けませんか。 1.oracle10gです。 2.バッチの内容は以下の通りです。 sqlplus USER/PASS@DB @COPY_テーブル名.sql > COPY_テーブル名.log pause exit 3.COPY_テーブル名.sqlの内容は以下の通りです。 INSERT INTO コピー先テーブル名 ( AA, BB, CC, DD, EE ) SELECT コピー元テーブル名.AA, コピー元テーブル名.BB, コピー元テーブル名.CC, コピー元テーブル名.DD, コピー元テーブル名.EE FROM コピー元テーブル名; / exit 4.エラーメッセージは以下の通りです。 57行が作成されました。 INSERT INTO コピー先テーブル名 ( * 行1でエラーが発生しました。: ORA-00001: 一意制約(コピー先テーブル名_PK)に反しています 5.コピー元のデータに一意制約違反になるようなデータはありません。  データも正しく入ってます。上記、エラーメッセージがお客様より指摘を受け、  説明できなくて困っています。 すみませんが、よろしくお願い致します。

  • SQL文の結合(一対多)がわからない

    色々とネットで調べてみたのですが、ピンとこないので質問させていただいています。 以下のようなテーブルを想定しています。 「テーブルA」 ユニークキー データ1 データ2 ・・・ 0001 ... 0002 ... 0003 ... 「テーブルB」 キー データA データB ・・・ 0001 ... 0001 ... 0002 ... テーブルAではユニークキーは重複していないのですが、テーブルBのキーは重複しています。 このような状況で、テーブルBの”キー”とテーブルAの”ユニークキー”を照合させて、テーブルBに”データ1 データ2 ・・・”を流し込みたいと思っています。 現状では、複数の検索結果が出るためにエラーとなっています。「一対多」結合を利用するというところまではわかったのですが、そこから先がよくわかりません。 どなたか解説していただけないでしょうか。 初心者の質問で恐縮ですが、お教え頂ければ嬉しいです。

  • imp コマンドに関して

    OS:winXp オラクル バージョン:10.2 ◎作業 1.testユーザをexpでバックアップ(BK1.dmp)を作成しました。 2.testユーザのテーブルのレコードを変更、削除追加などを行う 3.testユーザにimpでバックアップ(BK1.dmp)を行ったところ『一意制約エラーが発生します』のエラーが出ます。 (1)そのままのエラーだと思うのですが、この場合testユーザを再作成した方がいいのでしょうか? (2)1の状態に戻す方法が、他にもあるのでしょうか?

  • すでにあるテーブルのフィールドにユニークキーを設定できますか?

    はじめまして。 私のレンタルサーバーには最初からMYSQLというデータベースが付いています。 テーブルを設定して、すでにいくつかのデータを入力しています。 最近、重複して同じIDが入力できることに気づきました。 重複できないようにしたいと思い、調べたところ、ユニークキーというものを設定すれば重複しないらしいと言うことを知りました。 そちらのレンタルサーバーにはすでにPHPMYADMINが使えるようになっています。 PHPMYADMINをつかってIDのフィールドにユニークキーを設定しようとしました。 すると下記のようなエラーがでて、ユニークキーの設定に失敗しました。 > エラー > 実行した SQL 照会: > > ALTER TABLE `テーブルの名前` ADD UNIQUE ( > > `フィールドの名前` > ); > すでにデータが入力されているテーブルのフィールドにはユニークキーは設定できないのでしょうか? もし、すでにデータが入力されているテーブルのフィールドにユニークキーを設定する方法があったら教えてください。 もしくは私が勘違いをしている部分があったら教えて頂ければ幸いです。

    • ベストアンサー
    • MySQL
  • [MySQL] UNIQUE制約の値を更新する方法

    表題にUNIQUE制約の値を「更新」する方法とありますが、 正確にはUNIQUE制約が設定された値を「入れ替える」方法について質問します。 あるテーブルに order という並び順(数値)を格納するカラムがあるとします。※このテーブルのプライマリーキーは id とします。 並び順ですので一意な値です。よって、order にUNIQUE制約を設定しています。 例えば 1~5 個のデータ(フィールド)があったとして、並び順も 1~5 あるわけですが、この並び順を入れ替える場合、並び順を格納しているカラム( order )にUNIQUE制約があるため、それぞれ UPDATE で上書きすることができません。 つまり、{ id: 1, order: 1 } というデータと { id: 2, order: 2 } というデータの並び順( order )を { id: 1, order: 2 } と { id: 2, order: 1 } というように入れ替えようとする場合、並び順( order )は一意であるため、UPDATE で上書きができないのです。 できればトランザクション内で処理したいのですが、これらの処理をスマートに更新する方法はないでしょうか。それとも、並び順( order )にUNIQUE制約を設定せず、アプリケーション側で並び順( order )を一意に保つよう実装するしかないでしょうか。

    • ベストアンサー
    • MySQL
  • Accessのテーブルデータを一気にVBAで追加したい・・

    Accessのテーブルデータを一気にVBAで追加したい・・ Accessに一時商品登録データというテーブルがあり、 問題なければ商品登録データにデータを流し込みたいと思っています テーブルのデータ構造は全く同じです VBAで一時商品登録のテーブルから一件ずつデータを読み取って 商品登録データに追加することは出来るのですが 一気にデータを追加する方法があれば教えていただけないでしょうか? よろしくお願いいたいます

  • オラクルのエクスポートについて

    こんにちわ。 あるdmpファイルをインポートした際、その中のデータには主キーの重複したレコードが存在しているらしく一意制約エラーでおちてしまいます。 もちろん、テーブル構造もエクスポートしている為、エクスポートした時点で、テーブル内がそのような状況になるということは有り得ないはずなのですが、バイナリエディタで覗くと実際、キーの重複したデータが存在しています。 というわけで、dmpファイルをバイナリエディタなどで編集するというようなことはナシで(あくまでオラクルユーティリティ内の範疇で)、そのようなdmpファイルを強引に作ることが出来るのでしょうか? よろしくお願いします。

  • トリガーとシーケンスについて

    DBはOracle9i(Ver9.2.0.1かな?)です。 テスト環境から本番環境にデータ移行する際に テーブルも変更を加えました。 すると変更を加えたテーブルに関連するトリガーが未コンパイル状態になってしまいました。 仕方なく、再コンパイルするとトリガーに記述のあるシーケンスの最終番号が若干ずれていました。 コンパイルすることによってずれることがあるのでしょうか? シーケンスは初期化されたわけではなく、若干ずれてるだけです。 そのシーケンスを使用して登録処理を行っているので一意制約違反がでまくりです。 どなたかアドバイスお願いします。

  • データ登録時、重複エラーを避けたい

    MYSQLのデータベースの、IDという項目が主キーのTESTというテーブルに、データをに登録する際、 既に主キーが同じデータがない場合に、という条件をつけたいのですが、 下のように書くと、エラーになってしまいます。 INSERT INTO TEST (ID, NAME) VALUES ('a', 'abc') WHERE NOT EXISTS (SELECT * FROM TEST WHERE ID = 'a'); どうしたらよいか教えてください。

    • ベストアンサー
    • MySQL
  • バッチプログラムでSQLSever2008を操作

    教えてください。 (1) SQLSever2008内にあるデータベース1のテーブルAのデータを削除 (2) 同じインスタンス内にあるデータベース2のテーブルAのデータを、DB1のテーブルAにコピー (3) (2)の処理が失敗したらロールバック 上記のことを、バッチプログラムで行いたいと思っております。 単にコマンドプロンプトで入力するというのであれば(1)も(2)もできるのですが、 バッチプログラムで行うとなると、どうやっていいのか見当もつきません。 さらに(3)は、(2)でSQLを実行した戻り値も見なければならないと思います。 データベース1のテーブルAとデータベース2のテーブルAはまったく同じ構成です。 自分なりに色々調べてはいるのですがどうしてもわかりません。 もしどなたかご存知の方がいらっしゃったらぜひ教えてください。 どうぞよろしくお願いいたします。