错误的Oracle数值或值错误

时间:2014-01-21 20:44:05

标签: vb.net oracle oracle11g corruption ora-06502

我有一个持续的问题,Windows服务会收到此Oracle错误:

消息:ORA-06502:PL / SQL:数字或值错误:字符到数字转换错误

但是,我肯定我将数值传递给Oracle。通过使用我们的Oracle DBA和Oracle支持服务单,我们能够捕获Oracle服务器收到的内容。我的问题是绑定变量#10。 Oracle在服务器上的跟踪日志中报告的值是“ A @ Y8 ”。但是,我实际发送的值是 167569173

Oracle值“A @ Y8”看起来并不熟悉 - 它不是来自其他字段的值。它始终与Oracle跟踪文件中的值相同 - 始终为A @ Y8。但是我发送的数值对于每条记录都是不同的。


该服务每隔几分钟从外部源提取数据并将其插入Oracle。它工作了大约两天,然后我得到了ORA-06502。一旦我收到Oracle错误,我会在每次通过时继续获取它,直到我重新启动服务。当服务重新启动时,它会运行属性几天 - 即使它正在拉动导致错误的相同数据。




  • Windows服务是用VB.Net编写的。
  • 当我读取数据时,我把字段放入可以为空的整数 - INT32?
  • 我将此变量发送到Oracle包中,该包抛出了 ORA-06502和跟踪值显示“A @ Y8”的值。
  • 然后我记录变量的值,我的日志显示为数字
    (它记录为167569173)。

对程序的调用发生转换错误。也就是说,当尝试将参数传递给过程中实际插入的过程no时。

不知何故,Oracle收到代码时,我的代码中的Integer值不是Integer。似乎有一些腐败,但我认为它不在Vb.Net中。我的字段是一个整数,不符合Oracle报告的值。 如果该字段确实保持该值,那么它应该在我记录它时记录该值。


如何查看Oracle客户端向Oracle服务器发送的值?我找不到任何相关的客户端日志。

关于可能导致这种情况的任何想法?


以下是Oracle跟踪条目:

Bind#10
oacdty=01 mxl=32(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=178 siz=0 off=480
kxsbbbfp=9fffffffbed31848 bln=32 avl=06 flg=01
value="A@Y8" 
EXEC #11529215044982021440:c=0,e=1300,p=0,cr=34359738368,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=2656312500288
ERROR #4:err=6502 tim=2656312500311

这是我的代码: 这是插入数据库的方法 - 它会抛出错误:

Public Shared Sub AddNewUploadedDocument(document As ManualUploadDocument)
    Using conn As OracleConnection = DataFactory.GetConnection()
        Using command As New OracleCommand("OM.EXTERNAL_DOCUMENT_OBJECTS.insertUploadedDocuments", conn)
            command.CommandType = CommandType.StoredProcedure
            command.Parameters.Add("tSelecteeID", document.SelecteeID)
            command.Parameters.Add("tFileName", document.FileNameGUID)
            command.Parameters.Add("tFileType", document.FileType)
            command.Parameters.Add("tOriginalFileName", document.OriginalFileName)
            command.Parameters.Add("tOriginalFileType", document.OriginalFileType)
            command.Parameters.Add("tDocTypeID", DBNull.Value)
            command.Parameters.Add("tStatus", document.Status.ToString())
            command.Parameters.Add("tSource", Integer.Parse(document.Source))
            command.Parameters.Add("tSubmitted", Convert.ToInt32(document.Submitted))
            command.Parameters.Add("tIsStaffingConversion", Convert.ToInt32(document.IsStaffingConversion))
            command.Parameters.Add("tStaffingDocumentationID", document.StaffingDocumentationID)

            command.ExecuteNonQuery()
        End Using
        'close connection
        conn.Close()
    End Using

End Sub

在此之后,我调用此方法来记录值​​:

Private Shared Function getInsertAttemptFields(document As OnBoardingDataObjects.ManualUploadDocument) As String
    Dim sb As New StringBuilder()
    sb.AppendLine("Insert Fields")
    sb.Append("tSelecteeID:")
    sb.AppendLine(document.SelecteeID)
    sb.Append("tFileName:")
    sb.AppendLine(document.FileNameGUID)
    sb.Append("tFileType:")
    sb.AppendLine(document.FileType)
    sb.Append("tOriginalFileName:")
    sb.AppendLine(document.OriginalFileName)
    sb.Append("tOriginalFileType:")
    sb.AppendLine(document.OriginalFileType)
    sb.Append("tDocTypeID:")
    sb.AppendLine("<null>")
    sb.Append("tStatus:")
    sb.AppendLine(document.Status.ToString())
    sb.Append("tSource:")
    sb.AppendLine(Integer.Parse(document.Source))
    sb.Append("tSubmitted:")
    sb.AppendLine(Convert.ToInt32(document.Submitted))
    sb.Append("tIsStaffingConversion:")
    sb.AppendLine(Convert.ToInt32(document.IsStaffingConversion))
    sb.Append("tStaffingDocumentationID:")
    sb.AppendLine(document.StaffingDocumentationID)

    Return sb.ToString()
End Function

这是我传递给两个方法的同一个对象。 StaffingDocumentationID字段是Oracle跟踪显示为A @ Y8的字段,日志显示为167569173。

这是我传递的manualUploadDocument对象的定义。为简洁起见,我在某些方法中删除了代码 - 这里的属性是相关的,删除的代码不会引用它们。

<Serializable()>
Public Class ManualUploadDocument

    Private _Submitted As Boolean = False

    Public Property DocumentUploadID As Integer
    Public Property SelecteeID As Integer
    Public ReadOnly Property FileName As String
        Get
            Return FileNameGUID + "." + FileType
        End Get
    End Property
    Public Property FileType As String
    Public Property OriginalFileName As String = ""
    Public Property OriginalFileType As String = ""
    Public Property DocumentTypeID As Integer
    Public Property DocumentType As String = ""
    Public Property UploadDate As Date
    Public Property FileNameGUID As String
    Public Property Status As PublicEnums.ManualUploadStatus
    Public Property Source As PublicEnums.ManualUploadSource
    Public Property IsMarkedFortransmission As Boolean = False
    Public Property TransmissionStatusDescription As String
    Public Property IsStaffingConversion As Boolean = False
    Public Property StaffingDocumentationID As Int32?


    Public Property Submitted As Boolean
        Get
            Return _Submitted
        End Get
        Set(value As Boolean)
            _Submitted = value
        End Set
    End Property


    Public Shared Function getStatusDisplayName(status As PublicEnums.ManualUploadStatus) As String
        Dim name As String = ""
        'Some code here

        Return name
    End Function

    Public Shared Function getStatusDescription(status As PublicEnums.ManualUploadStatus) As String
        Dim val As String = ""
        'Some code here

        Return val
    End Function

End Class

1 个答案:

答案 0 :(得分:0)

好吧,我没有在提供的代码中看到任何错误。因此,OM.EXTERNAL_DOCUMENT_OBJECTS.insertUploadedDocuments存储过程中应该存在一些错误。无论如何,我有三条建议:

1-确保存储过程OM.EXTERNAL_DOCUMENT_OBJECTS.insertUploadedDocuments正确。
2-在AddNewUploadedDocument中使用try catch块,如:

Public Shared Sub AddNewUploadedDocument(document As ManualUploadDocument)
    Using conn As OracleConnection = DataFactory.GetConnection()
        Using command As New OracleCommand("OM.EXTERNAL_DOCUMENT_OBJECTS.insertUploadedDocuments", conn)
            Try


            command.CommandType = CommandType.StoredProcedure
            command.Parameters.Add("tSelecteeID", document.SelecteeID)
            command.Parameters.Add("tFileName", document.FileNameGUID)
            command.Parameters.Add("tFileType", document.FileType)
            command.Parameters.Add("tOriginalFileName", document.OriginalFileName)
            command.Parameters.Add("tOriginalFileType", document.OriginalFileType)
            command.Parameters.Add("tDocTypeID", DBNull.Value)
            command.Parameters.Add("tStatus", document.Status.ToString())
            command.Parameters.Add("tSource", Integer.Parse(document.Source))
            command.Parameters.Add("tSubmitted", Convert.ToInt32(document.Submitted))
            command.Parameters.Add("tIsStaffingConversion", Convert.ToInt32(document.IsStaffingConversion))
            command.Parameters.Add("tStaffingDocumentationID", document.StaffingDocumentationID)

            command.ExecuteNonQuery()

            Catch Ex as Exception
                 Log (document.StaffingDocumentationID)
                 Log (Ex.StackTrace)
            End Try

结束使用             '紧密联系             conn.Close()         结束使用

End Sub

3-如果其他一切都失败了,用sql语句而不是存储过程重写AddNewUploadedDocument。