■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#565-0FETCHをループで使うには?うきょ2001-08-29(水) 11:18
     #567-0RE#565:FETCHをループで使うには?Say2001-08-29(水) 13:35
     #568-0RE#567:FETCHをループで使うには?うきょ2001-08-29(水) 14:34
     #571-0RE#568:FETCHをループで使うには?藤代千尋2001-08-29(水) 23:54
     #573-0RE#571:FETCHをループで使うには?うきょ2001-08-30(木) 09:56
     #574-0RE#573:FETCHをループで使うには?うきょ2001-08-30(木) 13:48
     #579-0RE#574:FETCHをループで使うには?藤代千尋2001-08-30(木) 22:11
#565-0
FETCHをループで使うには?
VB6でoo4oを用いてオラクルに接続しています。
オラクルについては超初心者なのですが、以下のコードでfld1,fld2の
各値が取り出せるのは理解できます。(PL/SQL分が自信ないですが)

    With OraDB
        .Parameters.Add "BINDFLD1", "", ORAPARM_OUTPUT
        .Parameters("BINDFLD1").ServerType = ORATYPE_CHAR
        .Parameters.Add "BINDFLD2", "", ORAPARM_OUTPUT
        .Parameters("BINDFLD2").ServerType = ORATYPE_CHAR

        strSQL = "declare cursor c1 is Select fld1, fld2 From table1; "
        strSQL = strSQL & "begin open c1; "
        strSQL = strSQL & "fetch c1 into :BINDFLD1, :BINDFLD2; end;"
    
        .ExecuteSLQ strSQL

        Text1.Text = .Parameters("BINDFLD1").Value
        Text2.Text = .Parameters("BINDFLD2").Value
    End With

ではこのSelect文で複数行取り出すときはループはどこに入れればよいのでしょう?
SQL文の中にLoop〜End Loopを入れると取得時(上の例のText1.Text〜に当たる個所)に
1つしか取り出せなさそうですし、かと言ってfetch以降のSQL文だけをVBのLoopで繰り返すと
「カーソルc1が開いていない」となるし、VBのLoopでdeclare〜open〜fetchを繰り返すと
そのつどカーソルが開かれて2レコード目以降のデータが取り出せないし・・・。
というわけで丸1日奮闘しましたが、お手上げ状態です。
OraParamArrayオブジェクトのGet_Valueもヘルプで見て試しましたが、なぜかGet_Valueは
「サポートしていません」とエラーになります。
どなたか解決法を教えてください。よろしくお願いします。


#567-0
RE#565:FETCHをループで使うには?
要は、table1テーブルのfld1,fld2フィールドのレコードセットがほしいのでしょう?

Private Function Err_lngfncFunctionName() As Long
    Dim oraDyn As OraDynaset
    Dim strSQL As String
    Dim strFld1 As String
    Dim strFld2 As String
lngfncFunctionName = clngFale
On Error GoTo Err_lngfncFunctionName
    With OraDB
        strSQL = "Select fld1, fld2 From table1 "
        Set oraDyn = .CreateDynaset(strSQL, ORADYN_READONLY + ORADYN_NOCACHE)
        If .LastServerErr <> 0 Or .LastServerErrText <> "" Then
            Err.Raise .LastServerErr, "lngfncFunctionName", .LastServerErrText
        End If
    End With
    Do Until oraDyn.EOF
            strFld1 = oraDyn("fld1")
            strFld2 = oraDyn("fld2")
            '取得後の処理
        ' .........
        
        oraDyn.MoveNext
    Loop
lngfncFunctionName = clngSuccess
Exit_lngfncFunctionName:
    Exit Function
Err_lngfncFunctionName:
    MsgBox "Error No:" & CStr(Err.Number) & vbCrLf & _
           "Source:" & Err.Source & vbCrLf & _
           "Msg:" & Err.Description
    Resume Exit_lngfncFunctionName
End Function
とかじゃいけませんか?

通常カーソルはストアドでまわすときつかいます。
VBでまわすときはレコードセットつかいます。
#568-0
RE#567:FETCHをループで使うには?
ご回答ありがとうございます。
しかし、レコードセットではだめなのです。
Glueからoo4oのコンバージョン作業をしていて、元のソースでストアドのようになっているのです。
元々は普通のSelect文(レコードセットで置き換え可)だったものがあえてコメントになっていて、
open、fetchなどを使ってとりだしているのです。
レコードセットを使えば楽なのですが、この他の方法はないのでしょうか?
#571-0
RE#568:FETCHをループで使うには?
> しかし、レコードセットではだめなのです。
> Glueからoo4oのコンバージョン作業をしていて、元のソースでストアドのようになっているのです。
> 元々は普通のSelect文(レコードセットで置き換え可)だったものがあえてコメントになっていて、
> open、fetchなどを使ってとりだしているのです。
> レコードセットを使えば楽なのですが、この他の方法はないのでしょうか?

レコードセットをコメントアウトしたのは、Glue でのバグ回避やスピードアップの
ためではないですか? 変更理由は分かりますか? 

処理内容自体は、複数行のレコードを取得するだけなので、レコードセットで充分な
はずです。とりあえず、レコードセットで作成してしまったらどうでしょう。それで、
何か問題が起こったら、あらためて FETCH に挑戦すればよいと思います。(^_^)

#データベース自体を変えるわけですから、アクセス手段は、新しいデータベースに
 あわせて構わないはずです。
#573-0
RE#571:FETCHをループで使うには?
> レコードセットをコメントアウトしたのは、Glue でのバグ回避やスピードアップの
> ためではないですか? 変更理由は分かりますか? 
> 
> 処理内容自体は、複数行のレコードを取得するだけなので、レコードセットで充分な
> はずです。とりあえず、レコードセットで作成してしまったらどうでしょう。それで、
> 何か問題が起こったら、あらためて FETCH に挑戦すればよいと思います。(^_^)
> 
> #データベース自体を変えるわけですから、アクセス手段は、新しいデータベースに
>  あわせて構わないはずです。

ご意見ありがとうございます。
おそらく速度の関係でコメントアウトされたのだと思います。
レコードセットに変換してみたところ元のソースで約35秒の処理が、レコードセットでは3分40秒も
かかってしまいました。
なのでストアドでワークテーブルに出力する処理を行い、そのワークをレコードセットで取り出そうかなと
考えています。(できるんだろうか・・・?)
元のGlueでの記述では「allocate」、「prepare」、「execute」して、VBのループで「fetch」しています。
fetchだけループで回して1行づつデータ取得できるのはoo4oにはないGlueだけの仕様なのでしょうか?
#574-0
RE#573:FETCHをループで使うには?
> なのでストアドでワークテーブルに出力する処理を行い、そのワークをレコードセットで取り出そうかなと
> 考えています。(できるんだろうか・・・?)

よく考えたらこれでは処理が増えてもっと時間がかかりますね。(実際効率が下がった)
なにかいい方法はないでしょうか?
バインド変数を使えばいいんでしょうけど、方法が分かりません。
どなたかよろしくお願いします。
#579-0
RE#574:FETCHをループで使うには?
> > なのでストアドでワークテーブルに出力する処理を行い、そのワークをレコードセットで取り出そうかなと
> > 考えています。(できるんだろうか・・・?)
> よく考えたらこれでは処理が増えてもっと時間がかかりますね。(実際効率が下がった)
> なにかいい方法はないでしょうか?
> バインド変数を使えばいいんでしょうけど、方法が分かりません。

最初の投稿では、パラメータを、フィールド取得のために使ってますよね。
抽出もないですから、Say さんの案(単純レコードセットでの取得)で良いのではないですか?

もし、抽出条件があって、それが1レコードごとに変わるなら、パラメータ‘配列’を使う手も
ありますよ。(^_^)

#もし、上の方法では取れないなら、どんなデータを取得したいのか、どんな条件があるのか、
 を投稿してください。(^_^)/
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)