
現在、以下の環境で開発を行っているのですが、
いくら調べても埒があかないので、
こちらで質問させていただくことにしました。
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」記述について一切触れられていない)
ご存知の方、いらっしゃいましたら、
ご教授願います。
大変困っています。
No.1ベストアンサー
- 回答日時:
NVL(TAB_FLG,'☆') とSQLに記述した時点で、列名はTAB_FLGでなく、NVL(TAB_FLG)になりますので、
OraDynaset.Fields("TAB_FLG")で列名無効のエラーになるのは至極当然の事です。
こういう場合は、お察しの通りasで別名を付与してやるのが定石です。他にもSUM関数等でも同じ事です。
OraDynaset.Fields("NVL(TAB_FLG)") とやっても、もしかしたらうまくいくかもしれません。
この辺はDBドライバの処理系に依存するので、一慨にOKと言えないのですが。そういう問題の解決法としてas句が用意されています。
回答ありがとうございます。
こちらでも少し検討した結果、
NVL関数をつけたらやはり、
「as」で名前をつけてあげないといけないのですね。
もっと早く気づきたかったです。。
というか、いくら調べても全然出てこなかったので、
本当に困りました。。
これから頑張って、「as」記述することにします・・・
ありがとうございました。
No.2
- 回答日時:
今、自宅からなので実機での確認ができないのですが
>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」で取ってくるよう厳命されてます。
回答ありがとうございます。
すでに解決してしまったので、
先着順で良回答を選ばせていただきました。
が、とても勉強になったので、
「役にたった」と投票させていただきました。
テーブルの項目数が多いので、
今後、SQLに修正が入ることを考慮すると、
インデックスを使用することは避けました。
「.value」をつけるとよいのですね。
とても勉強になりました。
「as」記述のついでに、つけるか。。
う~。。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
はじめまして!
-
ORA-01843: 指定した月が無効で...
-
CASE文のエラーについて
-
シェルスクリプトでオラクルの...
-
ORA-12571パケット書き込みエラ...
-
オラクル表領域データファイル...
-
「ORA-00907: 右カッコがありま...
-
SQL*Plus内でPL/SQL、SQLを実行...
-
ORA-06502のエラー
-
外部ライブラリのロード中にエ...
-
SQL*Loaderについて2
-
PL-SQLでORA-01013エラー
-
sqlのエラーハンドリングについ...
-
エラーコードについて
-
PL/SQLによるCREATE TABLE後のI...
-
PL/SQLのコンパイルエラーにつ...
-
dmpファイルのインポート時にで...
-
ExcelVBAからOracleストアド実行
-
DATABSE LINKについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
PL/SQL PLS-00103エラーについて
-
CASE文のエラーについて
-
ORA-01843: 指定した月が無効で...
-
はじめまして!
-
PCC-S-02201エラーの対処を教え...
-
「ORA-00907: 右カッコがありま...
-
ORA-06502のエラー
-
シェルスクリプトでオラクルの...
-
PL/SQLによるCREATE TABLE後のI...
-
PL/SQLのコンパイルエラーにつ...
-
ACCESSでパススルークエリにパ...
-
データベースのカラムの型がCHA...
-
ビューが作成できない
-
HAVING句でのBETWEEN演算子
-
ORA-12571パケット書き込みエラ...
-
無効なSQL文の具体例を教えてく...
-
pro*c で pl/sql に変数を渡す...
-
PL/SQLでPLS-00201のエラー
-
エラーコードについて
おすすめ情報