最近は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_をつけることにします^^;
2007年10月11日木曜日
ORA-01422に大苦戦。
登録:
コメントの投稿 (Atom)
0 コメント:
コメントを投稿