Oracle ODP.NET 使用参数调用包过程时出现问题

2024-01-04

Problem:尝试调用打包存储过程,但根据参数的值,调用失败。

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}

答案是Oracle 9.2.0.6.0中存在一个bug,导致间歇性的VARCHAR2绑定错误。惊人的。

这篇论坛帖子终于给了我答案: https://forums.oracle.com/forums/thread.jspa?messageID=1456123

这种行为是持续的还是间歇性的?如果间歇性地发生,并且 您的数据库是 9206,您可能会遇到以下 RDBMS 错误:

Bug.4015165 (74) 绑定不同大小的 REGRN SCALAR VARCHAR2 随机失败并出现 ORA-06502

并且应该通过修补数据库来解决。

我不知道为什么,但 ODP 遇到这个 bug 的次数似乎比 其他司机。

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

干杯, 格雷格

快速检查证实我们所在的版本受到了影响:

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 的参数问题 https://stackoverflow.com/questions/1210956/parameter-issue-with-oracle-refcursor

ODP.NET 论坛主题“错误 ORA-06502 PL/SQL” https://forums.oracle.com/forums/thread.jspa?messageID=1456123

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle ODP.NET 使用参数调用包过程时出现问题 的相关文章

随机推荐

  • com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List;'

    错误 无法找到方法 com android build gradle api BaseVariant getOutputs Ljava util List 导致此意外错误的可能原因包括 Gradle 的依赖项缓存可能已损坏 这有时会在网络连
  • 如何确定 ColdFusion 应用程序使用哪些文件?

    我正在开始对现有的 ColdFusion 应用程序进行一些工作 该应用程序没有版本控制 并且看起来像是未使用的 cfm 文件 test cfm test2 cfm 等 我想了解哪些文件实际上是应用程序的一部分 这样我就可以将其以可管理的状态
  • VBScript 环境变量

    我有一个关于应该如何修复运行脚本时看到的错误的问题 我很确定这与我使用 COMPUTERNAME 环境变量的方式有关 我的脚本的作用是在本地压缩一些文件 然后使用 robocopy 将它们复制到已安装或共享的驱动器 然后检查文件大小是否相同
  • 将新记录添加到 GridView 但不应更新数据库

    我有一个绑定到数据视图的网格视图 OnPageLoad 我正在填充网格视图记录 我有一个文本框和一个按钮 所以现在我想向 GridView 添加更多记录 但这些记录不应添加到数据库中 它们只是添加到页面中 当然来自数据库的默认记录也会保留
  • Python 中的就地函数

    Python中有一个就地函数的概念 例如shuffle就位 因为它返回None 如何确定函数是否就位 from random import shuffle print type shuffle
  • Javascript 中的函数是对象还是类型?

    In his 雄辩的 JavaScript Haverbeke 声称 第 16 页 在 JavaScript 系统中 大部分数据被整齐地分成称为值的东西 每个值都有一个类型 它决定了它可以扮演的角色 值有六种基本类型 数字 字符串 布尔值
  • Herkou Redis - 证书验证失败(证书链中的自签名证书)

    我在我的一个业余项目中使用 heroku redis 一段时间了 我目前用它来做三件事 它是我存储 firebase 证书的地方 它用于缓存站点上的数据 它用于 Rails sidekiq 作业 最近 我的 heroku 使用量增加了 我不
  • 自动释放池中的快速闭包访问没有 self 的方法

    这是示例代码 func anyMethod Nothing here var myVariable autoreleasepool anyMethod This should show error print myVariable This
  • 异步网络接口状态检查

    在 Mac OS X 上 有没有办法在网络接口 en0 en1 状态发生变化 例如网络接口处于活动状态 非活动状态等 时获取异步通知 我想知道是否有一种方法可以获取异步通知 而不是轮询状态 以便每当有更改时 都会触发通知并且应用程序可以处理
  • scikit SGDClassifierpartial_fit 不会增量学习。返回“类应包含所有有效标签”

    我将两个数据流传递给 sgd clf 分类器 如下面的代码所示 第一个partial fit 正在获取第一个数据流x1 y1 第二个partial fit 正在获取第二个数据流x2 y2 下面的代码在第二个partial fit步骤中给了我
  • ggplot2 中的注释不支持换行符是粘贴和解析的命令

    Question 如何得到paste and parse in annotate of ggplot2尊重换行符 n 问题和MWE 我正在尝试重现ggplot2使用 NMDS 分析的应力图metaMDS包装内vegan 这是我的 MWE 后
  • 使用动态表名称查询 Oracle 数据库

    我陷入了一些糟糕的数据库设计中 我必须查询按日期命名的表 当表名称与相关日期进行硬编码时 以下查询有效 SELECT ajob ORDER ID ajob JOB NAME abim SERVICE ID shist SERVICE NAM
  • 基本 Qt 应用程序 (QMainWindow) 中不显示小部件

    我是 Qt 新手 正在用简单的例子进行一些练习 我只是想通过编码来测试我的知识 通过一个简单的应用程序 用户在 QLineEdit 小部件中键入文本 该文本将显示在 QLabel 中 没有必要让它有用 我只是想尝试一下 编译应用程序时 我没
  • 如何通过winForms控制iTunes

    我可以看到这里已经回答了类似的问题 我如何通过java在iTunes中播放特定歌曲 https stackoverflow com questions 15872600 how would i play a specific song in
  • 文件上传导致文件大小为 0,错误代码为 0

    我正在尝试将图像上传到 php 脚本 我有一个非持久性错误 导致某些上传的图像的文件大小为 0 我尝试将 FILES 数组打印到我的日志文件中 它显示错误代码为 0 这应该没问题 这些行 foreach FILES image file a
  • 重载方法调用有替代方案:String.format

    我在下面编写了以下 Scala 代码来处理传入的字符串 格式化字符串 将其附加到StringBuilder并返回格式化的String将转义的 unicode 返回给我的调用者进行其他处理 Scala 编译器在有以下内容的行中抱怨 Strin
  • Azure 是否按应用服务数量收费

    Azure 是否仅针对应用服务计划资源的使用量或我们根据该应用服务计划创建的应用服务数量收费 应用服务计划下创建的应用服务数量是否会影响成本 我正在开发一个微服务项目 我不确定是将每个微服务部署在专用应用程序服务中还是将所有微服务部署在一个
  • Set-Cookie 标头无法跨域工作

    我在一个网站上https aaa shared com 这个网站 称之为A 发送一个xhr请求网址https zzz shared com some path 网站Z 并接收具有以下标头的响应 access control allow cr
  • 如何使用 React 导航访问 redux 商店?

    我有应用程序 音乐应用程序 供两个用户输入 访客 用户注册 我有一个底部导航器 当来宾打开我的应用程序时 我只想渲染 4 个底部选项卡 主页 浏览 搜索 广播 但是当用户登录 注册时 我想渲染 5 个选项卡 之前的选项卡加上 Library
  • Oracle ODP.NET 使用参数调用包过程时出现问题

    Problem 尝试调用打包存储过程 但根据参数的值 调用失败 ORA 06502 PL SQL numeric or value error ORA 06512 at line 1 程序定义 procedure DUP EXACT SSN