• ベストアンサー

重複チェックを行わず、INSERT時にエラーではじけないか?

最近オラクルを学んでいるものです。勉強をしていて思った素朴な疑問があ るのでみなさん教えて下さい。 INSERTにて一意の部分が重複するとエラーで落ちてしまうと思うのですが、 だからと言ってINSERT手前で重複チェック、つまり一度DBを読んでから、 INNSERTすると返って二度手間ですし、これが業務アプリの場合レスポン スが悪くなりますよね? 何かこれを回避できる良い手段はあるのでしょうか? 初歩的な事かもしれませんがよろしくお願いします。

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

  • ベストアンサー
  • arara0123
  • ベストアンサー率47% (8/17)
回答No.1

昔やった方法ですが、エラーコードを判定することによって回避可能です ・いきなりInsertする(正常終了はもちろん問題なし) ・エラー時 それは一意制約のエラーコード?を判定 一意制約エラーなら → 次の処理へ? ・・・ それ以外のエラーなら → 落とす? ・・・ など ちなみにselectでチェックしてからinsertの場合でも そのわずかの間に他からinsertされていて、エラーになることもあります (同時にinsertしにいくことがなければ問題ありませんが)

sr20detk
質問者

お礼

どうもありがとうございます。 やはりエラーコードを返す事が出来るんですね!! 記述方法など色々調べなくては!!!

その他の回答 (1)

  • paz777
  • ベストアンサー率47% (77/163)
回答No.2

こんにちは。 ちょっと補足を・・・ > だからと言ってINSERT手前で重複チェック、つまり一度DBを読んでから、 > INNSERTすると返って二度手間ですし、これが業務アプリの場合レスポン > スが悪くなりますよね? selectする時にレコードの有無って何で判断されていますか? エラーコードを判断していませんか? insert時も同じですよ。 もし開発言語がPro*Cであれば変数"sqlca.sqlcode"にエラーコードが入り ますので、その内容を確認してエラーハンドリングすれば良いと思います。 ご参考まで・・・

sr20detk
質問者

お礼

>selectする時にレコードの有無って何で判断されていますか? 例えば、伝票ナンバーという一意の項目があり、 select * from 伝票 where 伝票.伝票ナンバー=100 ↑のように、まずselectで、重複するものがないか?をチェックしてから INSERTすると言った感じに考えていました。 なにぶん勉強している最中なので、これが良いやり方しかわからないので・・・(汗) >もし開発言語がPro*Cであれば 今現在純粋にオラクルを勉強しているので、その手の開発言語には一切 触れていません。 今回の疑問はあくまで勉強している段階にふと思っただけなので、あまり 難しい事いわれると????なので、せっかく色々説明していただいても 理解できないのでごめんなさい。。。

関連するQ&A