2

我有一个持续的问题,其中 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 编写的。
  • 当我读取数据时,我将字段放入可为空的 Integer – Int32?。
  • 我将此变量发送到抛出 ORA-06502 的 Oracle 包,并且跟踪值显示“A@Y8”的值。
  • 然后我记录变量的值,我的日志将其显示为数字
    (它记录为 167569173)。

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

不知何故,当 Oracle 收到它时,我的代码中的整数值不是整数。似乎有一些腐败,但我不认为它在 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
4

1 回答 1

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

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

End Sub

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

于 2014-01-23T22:53:39.317 回答