4

問題: パッケージ化されたストアド プロシージャを呼び出そうとしましたが、パラメーターの値によっては呼び出しが失敗します。

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1

手順の定義:

procedure DUP_EXACT (
    SSN in VARCHAR2, 
    LASTNAME in VARCHAR2, 
    FIRSTNAME in VARCHAR2, 
    MASTERRECORD IN VARCHAR2 DEFAULT NULL,
    C_Table out sp_cursor)

パラメータの作成:

    For Each SearchParameter In SearchParameters
        ValueParameter = New OracleParameter

        ValueParameter.Direction = ParameterDirection.Input
        ValueParameter.OracleDbType = OracleDbType.Varchar2
        ValueParameter.ParameterName = SearchParameter.ParameterFieldName

        If Not SearchParameter.TransformedFieldValue = Nothing Then
            ValueParameter.Value = SearchParameter.TransformedFieldValue
        Else
            ValueParameter.Value = String.Empty
        End If

        ExactMatchSearchParameters.Add(ValueParameter)
    Next

    Dim MasterRecordParameter As New OracleParameter()

    MasterRecordParameter.Direction = ParameterDirection.Input
    MasterRecordParameter.OracleDbType = OracleDbType.Varchar2
    MasterRecordParameter.ParameterName = "MASTERRECORD"
    MasterRecordParameter.Value = DBNull.Value

    ExactMatchSearchParameters.Add(MasterRecordParameter)

    Dim TableParameter As New OracleParameter

    TableParameter.ParameterName = "C_Table"
    TableParameter.OracleDbType = OracleDbType.RefCursor
    TableParameter.Direction = ParameterDirection.Output

    ExactMatchSearchParameters.Add(TableParameter)

実行:

Using Command As OracleCommand = 
        New OracleCommand(
            QualifiedProcedureName, 
            Me.Database.Connection)

    Command.CommandType = CommandType.StoredProcedure
    'Command.AddToStatementCache = False '

    For Each Parameter In Parameters
        Command.Parameters.Add(Parameter)
    Next

    Command.Connection.Open()

    'Command.Connection.FlushCache() '

    Using Reader As OracleDataReader = Command.ExecuteReader()

成功と失敗の例:

*** SUCCESS ***
[SSN]: "6#######0"
[LASTNAME]: "W_____x"
[FIRSTNAME]: "D______e"
[MASTERRECORD]: ""
[C_Table]: ""

*** FAILURE ***
[SSN]: "2#######_1"
[LASTNAME]: "C____n"
[FIRSTNAME]: "L___e"
[MASTERRECORD]: ""
[C_Table]: ""

*** FAILURE ***
[SSN]: "5#######5"
[LASTNAME]: "C_______s"
[FIRSTNAME]: "R_____o"
[MASTERRECORD]: ""
[C_Table]: ""

*** SUCCESS ***
[SSN]: "6#######0"
[LASTNAME]: "P___a"
[FIRSTNAME]: "N______r"
[MASTERRECORD]: ""
[C_Table]: ""

追加のテスト:

パラメータでODP.NETが実際にデータベースに送信しているものを確認するためにトレースを実行しようとしましたが、トレースファイルは意味のある情報を提供しませんでした(つまり、実際のパラメータ値)

TIME:2013/02/14-14:10:19:678 
TID:231c  
OpsSqlPrepare2(): 
SQL: Begin PACKAGE.DUP_EXACT(:v0, :v1, :v2, :v3, :v4); End;

パラメータ値の例:

?Command.Parameters(0)
{SSN}
    ArrayBindSize: Nothing
    ArrayBindStatus: Nothing
    CollectionType: None {0}
    DbType: String {16}
    Direction: Input {1}
    InvalidPrecision: 100
    InvalidScale: 129
    InvalidSize: -1
    IsNullable: False
    m_bOracleDbTypeExSet: False
    m_bReturnDateTimeOffset: False
    m_collRef: {Oracle.DataAccess.Client.OracleParameterCollection}
    m_commandText: ""
    m_direction: Input {1}
    m_disposed: False
    m_enumType: ORADBTYPE {4}
    m_modified: False
    m_oraDbType: Varchar2 {126}
    m_paramName: "SSN"
    m_paramPosOrName: ""
    m_saveValue: Nothing
    MaxScale: 127
    MinScale: -84
    Offset: 0
    OracleDbType: Varchar2 {126}
    OracleDbTypeEx: Varchar2 {126}
    ParameterEnumType: ORADBTYPE {4}
    ParameterName: "SSN"
    Precision: 0
    Scale: 0
    Size: 0
    SourceColumn: ""
    SourceColumnNullMapping: False
    SourceVersion: Current {512}
    Status: Success {0}
    UdtTypeName: ""
    Value: "4#######0" {String}
4

2 に答える 2

2

答えは、Oracle 9.2.0.6.0 に、断続的な VARCHAR2 バインディング エラーを引き起こすバグがあることです。素晴らしい。

このフォーラムの投稿で、最終的に答えが得られました。

この動作は一貫していますか、それとも断続的ですか? 断続的で、データベースが 9206 の場合、次の rdbms バグが発生している可能性があります。

Bug.4015165 (74) 異なるサイズのバインドで REGRN SCALAR VARCHAR2 がランダムに ORA-06502 で失敗する

データベースにパッチを適用することで解決する必要があります。

理由はわかりませんが、ODP は他のドライバーよりもこのバグに遭遇することが多いようです。

断続的でない場合、または現在のパッチ レベルのデータベースを使用している場合は、おそらく完全なテストケースが最適です。

乾杯、グレッグ

簡単なチェックで、私たちが使用しているバージョンが影響を受けていることが確認されました:

select * from v$version;
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production       
PL/SQL Release 9.2.0.6.0 - Production                            
CORE    9.2.0.6.0   Production                                          
TNS for 32-bit Windows: Version 9.2.0.6.0 - Production           
NLSRTL Version 9.2.0.6.0 - Production 

幸いなことに、本番サーバーは 10g であるため、最終的に開発サーバーも 10g に更新しました。viola も問題ありません。

アンサートレイル:

Oracle RefCursor のパラメータの問題

Oracle ODP.NET フォーラム

ODP.NET フォーラム スレッド「エラー ORA-06502 PL/SQL」

于 2013-02-15T19:31:48.213 に答える
1

奇妙に聞こえるかもしれませんが、クエリに表示されるときに oracle パラメータが追加されていることを確認してください。過去に何度かこの問題に遭遇しました (多くの場合、ODP.NET への移行で)。

于 2013-02-15T14:47:49.087 に答える