我有一个持续的问题,其中 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