アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、以下の環境で開発を行っているのですが、
いくら調べても埒があかないので、
こちらで質問させていただくことにしました。

OS:Windows2000Professional
言語:VB6sp6
サーバ:Oracle8i
接続方法:oo4o 8.1.7.3.15(パッチあて済み)


テーブルより、ある値(TAB_FLG、とします)をとってきて、
その値が☆ならOK、そうでなければNG、のようなコーディングです。

TAB_FLGにNULLが入っていることを考慮して、
NVL関数を使用したSELECT文を発行したのですが、
どうも、
その先の判定でエラーになってしまうのです。
具体的な記述は以下の通りです。


strSQL = "select nvl(TAB_FLG,'☆') from ~"
.
.
.
If OraDynaset.Fields("TAB_FLG") = "☆" then
Msgbox "OK"
Else
Msgbox "NG"
End If


※テーブルの項目数が多いことと、
 必ずレコードが1件しかヒットしないので、
 OraDynasetを直接判定に使用しています。


エラーの内容は、(VBのErrorから拾うと)
「OIP-04099:フィールド'TAB_FLG'は見つかりません。」
です。

NULLを無視して、NVL関数を使用しないSQLを発行すると、
このエラーは出ません。
あと、
NVL関数を記述する際に、
「NVL(TAB_FLG,'☆') as TAB_FLG」
という方法をとると、このエラーは出ません。

まったく原因がわからず困っています。
できれば、
使用するテーブルの項目数が多いので、
後者の「as」記述はしたくないのですが・・・

というか、
「as」記述は任意であったと思うので、
なくてもうまくいくはずなのですが・・・

OracleのPDFのマニュアル等にも、
ネットでいくら検索かけても、
解決策がありません。
(どころか、どこにもNVL関数の「as」記述について一切触れられていない)

ご存知の方、いらっしゃいましたら、
ご教授願います。

大変困っています。

A 回答 (2件)

NVL(TAB_FLG,'☆') とSQLに記述した時点で、列名はTAB_FLGでなく、NVL(TAB_FLG)になりますので、


OraDynaset.Fields("TAB_FLG")で列名無効のエラーになるのは至極当然の事です。

こういう場合は、お察しの通りasで別名を付与してやるのが定石です。他にもSUM関数等でも同じ事です。

OraDynaset.Fields("NVL(TAB_FLG)") とやっても、もしかしたらうまくいくかもしれません。
この辺はDBドライバの処理系に依存するので、一慨にOKと言えないのですが。そういう問題の解決法としてas句が用意されています。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

こちらでも少し検討した結果、
NVL関数をつけたらやはり、
「as」で名前をつけてあげないといけないのですね。

もっと早く気づきたかったです。。

というか、いくら調べても全然出てこなかったので、
本当に困りました。。

これから頑張って、「as」記述することにします・・・


ありがとうございました。

お礼日時:2005/08/09 21:50

今、自宅からなので実機での確認ができないのですが



>If OraDynaset.Fields("TAB_FLG") = "☆" then

こういう記述をするなら、関数を使った項目は別名定義しないと「OIP-04099:フィールド'TAB_FLG'は見つかりません。」というエラーが返ってきたと思いますよ。
これはNVLに関わらず、SUM,MAX,MIN等の関数もそうだったと思います。

>「NVL(TAB_FLG,'☆') as TAB_FLG」
as句を除いた記述もできますが、意味するところは同じです。
例:select sum(money) sum_money from money_tbl;
sum_moneyはsum(money)の別名です。

別名記述がどうしても嫌であれば、「If OraDynaset.Fields(0) = "☆" then」という記述ができます。
その場合、SELECT句にある1番目の項目はFields(0)、2番目の項目はFields(1)で取るようにしてください。

最後に「Fields()」じゃなくて「Fields().value」の記述の方がいいようですよ。
実例は忘れてしまったのですが、「.value」がなかったために望む値が取れなくてエラーの原因になったことがありました。以来、うちの会社では「.value」で取ってくるよう厳命されてます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

すでに解決してしまったので、
先着順で良回答を選ばせていただきました。
が、とても勉強になったので、
「役にたった」と投票させていただきました。


テーブルの項目数が多いので、
今後、SQLに修正が入ることを考慮すると、
インデックスを使用することは避けました。

「.value」をつけるとよいのですね。
とても勉強になりました。
「as」記述のついでに、つけるか。。

う~。。


本当にありがとうございました。

お礼日時:2005/08/09 21:55

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