2010-11-20 3 views
1

VBアプリケーション内からいくつかのPL/SQLプロシージャを実行しようとしています。VBスレッド内のOracleからのデータセットの入力

' Function getDataSet 
' builds a data set from given information 
' Parameters: 
' aCommand - the PL/SQL procedure to call 
' aParamCollection - an oraParameterCollection object containing all the parameters 
' aDataSet - a data set to hold the results 
' Returns: 
' number of rows retrieved 

Public Function getDataSet(_ 
    ByVal aCommand As String, _ 
    ByVal aParamCollection As oraParameterCollection, _ 
    ByRef aDataSet As DataSet _ 
    ) As Integer 

    Dim result As Integer = 0 

    ' define commands etc 
    Dim cmd As OracleCommand = New OracleCommand(aCommand, dbConn) 
    cmd.CommandType = CommandType.StoredProcedure 

    ' add parameters for the query 
    For i As Integer = 0 To aParamCollection.getParameterCount() - 1 
     cmd.Parameters.Add(New OracleParameter(_ 
           aParamCollection.getParameterByIndex(i).ParameterName, _ 
           aParamCollection.getParameterByIndex(i).ParameterType)).Value = _ 
           aParamCollection.getParameterByIndex(i).ParameterValue 
    Next 

    Dim param As OracleParameter = New OracleParameter("io_cursor", OracleDbType.RefCursor) 
    cmd.Parameters.Add(param).Direction = ParameterDirection.Output 
    CheckConnection() 
    cmd.ExecuteNonQuery() 

    Dim cur As OracleRefCursor 
    cur = param.Value 
    cmd.Dispose() 

    Dim theAdaptr As New OracleDataAdapter 

    If aDataSet IsNot Nothing Then 
     theAdaptr.Fill(aDataSet, cur) 
     result = aDataSet.Tables(0).Rows.Count 
    End If 

    Return result 

End Function 
:手順は

現在、各スレッドは順番に次のコードを呼び出す関数を呼び出すので、私は別のスレッドに(私はに新しいですその対象を)それらを置くつもり実行に時間がかかります


aCommandはは
aParamCollectionを実行するPL/SQLのPROCを=パラメータ、型を保持し、値カスタムクラスを=
aDataSet =得られたデータを保持するデータセット

しかし、私はアプリを実行したとき、私はこの時点でアクセス違反を取得:

theAdaptr.Fill(aDataSet, cur) 

私は別のスレッドが同時に記入する電話をかけることができないと仮定し、これは正しいでしょうか?私は現在ように、各スレッドをキックオフしています:アクセス違反が起こっを避けるために

Dim th_Mean As New Thread(AddressOf getMeanData) 
    Dim th_Stdev As New Thread(AddressOf getStdevData) 

    th_Mean.Name = "th_Mean" 
    th_Stdev.Name = "th_Stdev" 

    th_Mean.Start() 
    th_Stdev.Start()  

    Do While th_Mean.IsAlive Or th_Stdev.IsAlive 
    Loop 

は最終的に、私の質問は、私は何をやるべきですか? BBZ

答えて

0

を読み取るための

おかげで、データベース内の並列処理を追加することを検討していますか?宣言型SQLでは並列性が(比較的)簡単です。手順は、あなたが見る必要があるかもしれクエリよりも、行ごとの処理の詳細である場合

select /*+ parallel(my_table) */ * from my_table; 

:あなたのストアドプロシージャによっては、それは、何かスロークエリを見つけ、ヒントを追加するのと同じくらい簡単かもしれ並列パイプライン関数に変換します。

+0

返信用Thx。私が使用しているストアドprocsは、実際に私は別のスレッドで投稿したこのようなものです:http://stackoverflow.com/questions/4218345/solved-pl-sql-avg-function-with-vs2008-causing-arithmetic-operation-resulted -i DECODEでAVGを使用して、特定の名前に基づいてデータの平均を列にソートします。上記のクエリを1年以上実行すると、実行に10分以上かかります(これは、私が上で達成しようとしているものには不合理です!) – Bob

+0

この手順を最適化するには、いくつかの方法があります。リモートデータベース?可能な限り多くの処理を同じ場所で実行できれば、分散処理は非常に複雑です。すべてのテーブルがローカルであれば、並列処理を追加するのは簡単ですが、データベースリンク全体で並列化することはできません。 Oracleのマニュアルの中には、通常、分散表が通常はローカル・インスタンスに引き込まれ、そこで結合されていることが含まれています。 DRIVING_SITEのヒントが役立つかもしれませんか? –

+0

こんにちは、再びアドバイスのためのthx。私はこれについて図面ボードに戻って、クライアントコードで統計情報などを行うかもしれないと考えてください(私は、DBを使って仕事をすることがポイントだと思っていましたが)。私は、procsプライマリDBに入れて、私はヒントを使用していないので、それは学習曲線のように思えます(これは私が嫌うものではありませんが、このプロジェクトに重点を置くより重要なことです)。 – Bob