2007年10月11日木曜日

ORA-01422に大苦戦。

最近はVB.NETがわかんなくて
しょうもないことにハマリすぎで本当にやばい^^;
でも、新しいことを覚えるのは楽しいですね。
で、今日はオラクルで大ハマリ。
忘れないようにメモっと!

コードマスタにコードを渡して、コード値を取得するという
なんでもないファンクションを作成したのですが、その時に
なぜか、複数レコードがとれてしまいORA-01422でまくり。
しかし、ちゃんとプリマリキーを渡してるので絶対ありえない
のですが・・・。こっからバトル開始ROUND1!


(省略)
DECLARE
key varchar2(10)
cd varchar2(10)
val varchar2(255)
BEGIN

key := para_key;
code:= para_code;

SELECT value INTO val
FROM code_tbl
WHERE KEY = key
AND CODE = cd ;

RETURN val;
(以下続く)

と上記のような感じで、このときKEYとCODEはプライマリーキー
で必ず一意になります。またSELECT文単独では間違いなく
取得できます。

では、なぜここでダメだったのか?
いろいろ調べた結果

以下のようなレコードがあった場合
KEY CODE
001 1
001 2
001 3
002 1
002 9

where KEY = '001'
and CODE = '3'
これは問題なく取れます

where KEY = '001'
and CODE = '1'
これはエラーになる。

んでもって
where KEY = '001'
and CODE = '9'
なぜか、これがとれる(ここでビビっときました。)

つまり、カラムと変数が同じ場合
where '001' = '001'
and CODE = '9'
と判断され、結局CODEのカラムだけが
条件にきいている状態になっているのだと思われる。

これだとCODEのカラムには重複する値があるので
レコードが複数かえってきてもおかしくない。
しかも大文字小文字は同等に扱われる。

これがわからず、今日一日のほとんどを使ってしまったorz
ただでさえ納期までの時間ないのに・・・。

これにこりて変数には必ず接頭字w_をつけることにします^^;

0 件のコメント: