调用带有参数的包装程序甲骨文ODP.NET问题甲骨文、参数、程序、问题

2023-09-04 11:09:28 作者:装逼卖萌无所不能

问题: 试图调用一个封装存储的过程,但根据不同的参数的值的呼叫失败。

  ORA-06502:PL / SQL:数字或值错误
ORA-06512:第1行
 

过程定义:

 程序DUP_EXACT(
    SSN的VARCHAR2,
    LASTNAME的VARCHAR2,
    FIRSTNAME的VARCHAR2,
    MASTERRECORD IN VARCHAR2 DEFAULT NULL,
    C_Table出sp_cursor)
 

创建参数:

 对于每个SearchParameter在SearchParameters
        ValueParameter =新的OracleParameter

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

        如果没有SearchParameter.TransformedFieldValue =没有那么
            ValueParameter.Value = SearchParameter.TransformedFieldValue
        其他
            ValueParameter.Value =的String.Empty
        结束如果

        ExactMatchSearchParameters.Add(ValueParameter)
    下一个

    昏暗MasterRecordParameter作为新的OracleParameter()

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

    ExactMatchSearchParameters.Add(MasterRecordParameter)

    昏暗TableParameter作为新的OracleParameter

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

    ExactMatchSearchParameters.Add(TableParameter)
 
spring如何将请求参数封装到实体类的map属性中

执行:

 使用命令的OracleCommand =
        新的OracleCommand(
            QualifiedProcedureName,
            Me.Database.Connection)

    Command.CommandType = CommandType.StoredProcedure
    Command.AddToStatementCache =假'

    每个参数在参数
        Command.Parameters.Add(参数)
    下一个

    Command.Connection.Open()

    'Command.Connection.FlushCache()'

    使用阅读器OracleDataReader = Command.ExecuteReader却()
 

例成功案例和放大器;失败:

  ***成功***
[SSN]:6 ####### 0
[姓氏]:W_____x
[名字]:D______e
[MASTERRECORD]:
[C_Table]:

*** 失败 ***
[SSN]:2 ####### _ 1
[姓氏]:C____n
[名字]:L___e
[MASTERRECORD]:
[C_Table]:

*** 失败 ***
[SSN]:5 ####### 5
[姓氏]:C_______s
[名字]:R_____o
[MASTERRECORD]:
[C_Table]:

*** 成功 ***
[SSN]:6 ####### 0
[姓氏]:P___a
[名字]:N______r
[MASTERRECORD]:
[C_Table]:
 

其他测试:

我试图运行跟踪,看看有什么ODP.NET是实际发送到的参数数据库,但跟踪文件没有提供任何有意义的信息(即:实际参数值)

 时间:2013/02 / 14-14:10:19:678
TID:231C
OpsSql prepare2():
SQL:开始PACKAGE.DUP_EXACT(:V0,:V1,:V2,:V3,:V4);结束;
 

示例参数值:

 ?Command.Parameters(0)
{SSN}
    ArrayBindSize:无
    ArrayBindStatus:无
    CollectionType:无{0}
    的DbType:字符串{16}
    方向:输入{1}
    无效的precision:100
    InvalidScale:129
    InvalidSize:-1
    ISNULLABLE:假
    m_bOracleDbTypeExSet:假
    m_bReturnDateTimeOffset:假
    m_collRef:{} Oracle.DataAccess.Client.OracleParameterCollection
    m_commandText:
    m_direction:输入{1}
    m_disposed:假
    m_enumType:ORADBTYPE {4}
    m_modified:假
    m_oraDbType:VARCHAR2 {126}
    m_paramName:SSN
    m_paramPosOrName:
    m_saveValue:无
    MaxScale:127
    MinScale:-84
    偏移:0
    OracleDbType:VARCHAR2 {126}
    OracleDbTypeEx:VARCHAR2 {126}
    ParameterEnumType:ORADBTYPE {4}
    参数名称:SSN
    precision:0
    规模:0
    大小:0
    SourceColumn:
    SourceColumnNullMapping:假
    SourceVersion:当前的{512}
    状态:成功{0}
    UdtTypeName:
    值:4 ####### 0{字符串}
 

解决方案

答案是,有导致intermitten VARCHAR2绑定错误在甲骨文9.2.0.6.0的错误。真棒。

这个论坛后终于给了我答案:

  

这是行为是一致的或间歇性的?如果intermitten,和   你的数据库是9206,你可能会遇到下面的RDBMS错误:

     

Bug.4015165(74)REGRN标量VARCHAR2 IN结合不同尺寸   RANDOMLY失败,ORA-06502

     

和应该通过修改数据库来解决。

     

我不知道为什么,但ODP似乎遇到这个错误了很多超过   其他的驱动程序。

     

如果不是间歇性的,或者如果您使用的是当前补丁级别   数据库,一个完整的测试用例很可能是最好的。

     

干杯,   格雷格

一个快速检查证实,我们的版本受到影响:

  SELECT * FROM V $版本;
-------------------------------------------------- --------------
Oracle9i企业版发行9.2.0.6.0  - 生产
PL / SQL版本9.2.0.6.0  - 生产
核心9.2.0.6.0生产
TNS对32位Windows:版本9.2.0.6.0  - 生产
NLSRTL版本9.2.0.6.0  - 生产
 

幸运的是,我们的生产服务器10g中,所以我们终于更新了我们的开发服务器到10g,以及,中提琴,没有更多的问题。

答径:

参数问题与Oracle REFCURSOR

甲骨文ODP.NET论坛

ODP.NET论坛主题错误ORA-06502 PL / SQL

Problem: Trying to call a packaged stored procedure, but the call is failing depending on the values of the parameters.

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

Procedure Definition:

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

Parameter Creation:

    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)

Execution:

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()

Example Successes & Failures:

*** 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]: ""

Additional Testing:

I tried running a trace to see what ODP.NET was actually sending to the database in the parameters, but the tracefiles did not provide any meaningful information (IE: the actual parameter values)

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

Example Parameter Values:

?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}

解决方案

The answer is that there is a bug in Oracle 9.2.0.6.0 that causes intermitten VARCHAR2 binding errors. Awesome.

This forum post finally gave me the answer:

Is this behavior consistent or intermittent? If intermitten, and your db is 9206, you're likely encountering the following rdbms bug:

Bug.4015165 (74) REGRN SCALAR VARCHAR2 IN BINDS WITH DIFFERENT SIZE RANDOMLY FAILS WITH ORA-06502

and should be resolved by patching your database.

I'm not sure why, but ODP seems to encounter this bug a lot more than other drivers.

If not intermittent, or if you are using a current patch level of database, a complete testcase would probably be best.

Cheers, Greg

A quick check verified that the version we are on is affected:

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 

Luckily our production servers are 10g, so we finally updated our dev server to 10g as well, and viola, no more problems.

Answer Trail:

Parameter issue with Oracle RefCursor

Oracle ODP.NET Forum

ODP.NET Forum Thread "Error ORA-06502 PL/SQL"