dポイントプレゼントキャンペーン実施中!

最近オラクルを学んでいるものです。勉強をしていて思った素朴な疑問があ
るのでみなさん教えて下さい。

INSERTにて一意の部分が重複するとエラーで落ちてしまうと思うのですが、
だからと言ってINSERT手前で重複チェック、つまり一度DBを読んでから、
INNSERTすると返って二度手間ですし、これが業務アプリの場合レスポン
スが悪くなりますよね?

何かこれを回避できる良い手段はあるのでしょうか?
初歩的な事かもしれませんがよろしくお願いします。

A 回答 (2件)

昔やった方法ですが、エラーコードを判定することによって回避可能です



・いきなりInsertする(正常終了はもちろん問題なし)
・エラー時 それは一意制約のエラーコード?を判定
一意制約エラーなら → 次の処理へ? ・・・
それ以外のエラーなら → 落とす? ・・・ など

ちなみにselectでチェックしてからinsertの場合でも
そのわずかの間に他からinsertされていて、エラーになることもあります
(同時にinsertしにいくことがなければ問題ありませんが)
    • good
    • 1
この回答へのお礼

どうもありがとうございます。

やはりエラーコードを返す事が出来るんですね!!

記述方法など色々調べなくては!!!

お礼日時:2002/05/08 13:20

こんにちは。



ちょっと補足を・・・

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

ご参考まで・・・
    • good
    • 0
この回答へのお礼

>selectする時にレコードの有無って何で判断されていますか?
例えば、伝票ナンバーという一意の項目があり、
select * from 伝票 where 伝票.伝票ナンバー=100
↑のように、まずselectで、重複するものがないか?をチェックしてから
INSERTすると言った感じに考えていました。

なにぶん勉強している最中なので、これが良いやり方しかわからないので・・・(汗)

>もし開発言語がPro*Cであれば
今現在純粋にオラクルを勉強しているので、その手の開発言語には一切
触れていません。
今回の疑問はあくまで勉強している段階にふと思っただけなので、あまり
難しい事いわれると????なので、せっかく色々説明していただいても
理解できないのでごめんなさい。。。

お礼日時:2002/05/09 20:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!