0

Microsofts Oracle Driver から ODP.NET バージョン 10.2.0.100 に切り替えます。System.Data.OracleClient を使用して完全に機能するプロシージャでデータ型を OracleDBTypes に変更した後、20 を超えるパラメータを渡そうとすると、プロシージャは失敗します。返されるエラーは次のとおりです。

ORA-06550: 行 1、列 7: PLS-00306: 'ADD_TARP_EVENT' の呼び出しで引数の数または型が間違っています ORA-06550: 行 1、列 7: PL/SQL: ステートメントは無視されました

パラメータの数を 20 未満に減らすと、機能します。これは既知の問題ですか?

パラメータを作成するためのコードは次のとおりです。

    Shared Function CreateTarpEventCommand(ByVal aTarpEvent As TARPEventType) As OracleCommand
    Dim cmd As New OracleCommand

    With aTarpEvent

        cmd.Parameters.Add(New OracleParameter("I_facID_C", OracleDbType.Char)).Value = .FacilityShortName
        cmd.Parameters.Add(New OracleParameter("I_facName_VC", OracleDbType.Varchar2)).Value = .FacilityLongName
        cmd.Parameters.Add(New OracleParameter("I_client_VC", OracleDbType.Varchar2)).Value = .ComputerNameTarpIsRunningOn
        cmd.Parameters.Add(New OracleParameter("I_TARP_Version_VC", OracleDbType.Varchar2)).Value = .TarpVersionNumber
        cmd.Parameters.Add(New OracleParameter("I_NAS_Type_VC", OracleDbType.Varchar2)).Value = .FacilityNASSystemType
        cmd.Parameters.Add(New OracleParameter("I_Aircraft1_Callsign_VC", OracleDbType.Varchar2)).Value = .Aircraft1Callsign

        If .Aircraft1Type Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_Aircraft1_Type_VC", OracleDbType.Varchar2)).Value = .Aircraft1Type
        End If

        If .Aircraft1Category Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_Aircraft1_Cat_VC", OracleDbType.Varchar2)).Value = .Aircraft1Category
        End If

        cmd.Parameters.Add(New OracleParameter("I_Aircraft2_Callsign_VC", OracleDbType.Varchar2)).Value = .Aircraft2Callsign

        If .Aircraft2Type Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_Aircraft2_Type_VC", OracleDbType.Varchar2)).Value = .Aircraft2Type
        End If

        If .Aircraft2Category Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_Aircraft2_Cat_VC", OracleDbType.Varchar2)).Value = .Aircraft2Category
        End If

        If .SensorShortName Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_Sensor_Name_VC", OracleDbType.Varchar2)).Value = .SensorShortName
        End If


        If .TarpConfigurationName Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_TARP_Config_Name_VC", OracleDbType.Varchar2)).Value = .TarpConfigurationName
        End If

        If .EntryCreatorID Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_Create_VC", OracleDbType.Varchar2)).Value = .EntryCreatorID
        End If

        If .LogAction Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_Log_Action_VC", OracleDbType.Varchar2)).Value = .LogAction
        End If

        cmd.Parameters.Add(New OracleParameter("I_TARP_Mode_VC", OracleDbType.Varchar2)).Value = .TarpOperatingMode
        cmd.Parameters.Add(New OracleParameter("I_Min_Loss_N", OracleDbType.Decimal)).Value = .ClosestMeasureOfLoSS

        If .MapName Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_MAP_NAME_VC", OracleDbType.Varchar2)).Value = .MapName
        End If

        If .TarpConfigurationFileHash Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_CONFIG_HASH_VC", OracleDbType.Varchar2)).Value = .TarpConfigurationFileHash
        End If

        Dim aDate As OracleDate = CType(.LossEventsMessages(0).LossEventTime, System.DateTime)
        cmd.Parameters.Add(New OracleParameter("I_FIRST_LOSS_EVENT_DATE", OracleDbType.Date)).Value = aDate
        cmd.Parameters.Add(New OracleParameter("I_FIRST_LOSS_EVENT_MS_N", OracleDbType.Int32)).Value = .LossEventsMessages(0).LossEventMilliSeconds

        If .ZippedMapFiles Is Nothing Then
            cmd.Parameters.Add(New OracleParameter("I_Map_File_BL", OracleDbType.Blob)).Value = .ZippedMapFiles
        End If

        cmd.Parameters.Add(New OracleParameter("I_TARP_Package_BL", OracleDbType.Blob)).Value = .ZippedTarpPackageWithoutMaps

        cmd.Parameters.Add(New OracleParameter("rs_RESULTS", OracleDbType.RefCursor)).Direction = ParameterDirection.Output

    End With
    Return cmd
End Function

プロシージャを実行するためのコードは次のとおりです。

 Dim workingDataSet As New DataSet
    Dim oracleConnection As New OracleConnection
    Dim cmd As New OracleCommand
    Dim oracleDataAdapter As New OracleDataAdapter

    Try

         Using oracleConnection
            oracleConnection.ConnectionString = System.Configuration.ConfigurationManager.AppSettings("MasterConnectionODT")
            cmd = HelperDB.CreateTarpEventCommand(TarpEvent)

            cmd.Connection = oracleConnection
            cmd.CommandText = "LOADER.ADD_TARP_EVENT"
            cmd.CommandType = CommandType.StoredProcedure

            Using oracleConnection
                oracleConnection.Open()
                Dim aTransation As OracleTransaction = oracleConnection.BeginTransaction(IsolationLevel.ReadCommitted)
                Try
                    Using oracleDataAdapter
                        oracleDataAdapter = New OracleDataAdapter(cmd)
                        oracleDataAdapter.TableMappings.Add("Results", "rs_Max")
                        oracleDataAdapter.Fill(workingDataSet)

....

4

3 に答える 3

2

20 はそれほど大きな数ではないので、私は驚きます。何らかのパラメーターが混同されている可能性が高いと思います (20 を超えると、簡単に実行できます)。

しかし、試してみるには、21 個のパラメーターを持つプロシージャを作成することをお勧めします。すべてが Number であり、すべてのパラメーターに 1 を送信します。そうすれば、それが単なるタイプミスではないことを確認できます。

于 2010-04-28T18:10:59.083 に答える
0

Oracle プロシージャを呼び出す方法は 2 つあります。1つ目は命名表記

proc (p_1 => 'test', p2 => 1);

2つ目はポジショニング

proc ('test', 1);

名前付き表記法では、パラメーターを任意の順序で配置し、DEFAULT で定義されているパラメーターを省略することができます。位置表記法では、それらは定義されている順序である必要があり、最後のものだけを省略できます。つまり、5 つのパラメーターを指定し、プロシージャーに 6 つのパラメーターが定義されている場合、欠落しているパラメーターは 6 番目であると見なされます。繰り返しますが、6 番目には DEFAULT が必要です。出力パラメータにデフォルトを指定することはできず、指定する必要があります。

どちらを使用するかを選択するために ODP がどのように機能するかはわかりません (ただし、DBMS_MONITOR を使用してセッションをトレースし、結果のトレース ファイルを調べることで確認できます)。

とにかく、パラメーターの名前がコード内のものと一致することを確認してください。Oracle は、引用符で囲まれていない限り、識別子を大文字として扱います。また、いずれかのパラメーターに DEFAULT がない場合は、呼び出しで設定する必要があります (null に設定されている場合でも)。

于 2010-04-28T23:09:59.433 に答える
0

ストアド プロシージャ「LOADER.ADD_TARP_EVENT」は、サーバー側で該当する場合、プロシージャ パラメータ値をデフォルトで Null に設定していました。ADO Oracle コマンドを作成したとき、Null パラメーターは入力しませんでした。これは、プロシージャーで既にデフォルトで Null に設定されているためです。これは ADO.NET でうまく機能しました。ODT では明らかに、値を dbNull として渡す必要があります。値に dbNull を渡すと、すべて期待どおりに機能しました。

于 2010-04-29T12:27:52.090 に答える