2014-01-21 3 views
2

У меня есть постоянный вопрос, в котором служба окна получает эту ошибку Oracle:Ошибочного Oracle числовой или значения ошибка

сообщения: ORA-06502: PL/SQL: числовую или значения ошибки: символ ошибки преобразования числа

Однако, я уверен что я передаю числовое значение Oracle. Работая с нашим Oracle DBA и билетом поддержки Oracle, мы смогли захватить то, что получает сервер Oracle. Моя проблема связана с переменной привязки # 10. Значение отчетов Oracle в журнале трассировки на сервере «A @ Y8». Однако значение, которое я фактически отправляю, равно .

Значение Oracle A @ Y8 не выглядит знакомым - это не значение из другого поля. Это всегда значение в файле трассировки Oracle - всегда A @ Y8. Но числовое значение, которое я отправляю, отличается для каждой записи.


Служба извлекает данные каждые несколько минут от внешнего источника и вставляет их в Oracle. Он работает около двух дней, а затем я получаю ORA-06502. Как только я получаю ошибку Oracle, я продолжаю получать ее на каждом проходе, пока не перезапущу службу. Когда служба перезагружается, она работает в течение нескольких дней, даже если она вытаскивает те же данные, которые вызывают ошибку.




  • The службы Windows написано в VB.Net.
  • Когда я прочитал данные, я поместил поле в значение NULL Integer - Int32 ?.
  • Я отправляю эту переменную в пакет Oracle, который выдает ORA-06502, а значение трассировки показывает значение «A @ Y8».
  • Затем я регистрирую значение переменной, и мой журнал показывает его как числовой
    (он регистрируется как 167569173).

Ошибка преобразования происходит при вызове процедуры. То есть при попытке передать параметр в процедуру нет в фактической вставке внутри процедуры.

Как-то, значение Integer в моем коде не является целым, когда 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="[email protected]" 
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

Что такое внешний источник? И, пожалуйста, добавьте свой код VB.NET, поскольку, несмотря на то, что вы уверены, ошибка, вероятно, вызвана им. – Lazarus

+0

Я извлекаю данные из другой базы данных Oracle. Я отправлю код. –

+0

Lazarus, любые идеи из кода, который я опубликовал. Вам нужна дополнительная информация? –

ответ

0

Ну, я не вижу ошибок в предоставленных кодах. Таким образом, в хранимой процедуре OM.EXTERNAL_DOCUMENT_OBJECTS.insertUploadedDocuments должны быть ошибки. В любом случае у меня есть три рекомендации:

1- Убедитесь, что хранимая процедура OM.EXTERNAL_DOCUMENT_OBJECTS.insertUploadedDocuments верна.
2- Используйте попытка поймать блок в AddNewUploadedDocument, как:

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 «тесная связь conn.Close() End Использование

End Sub 

3- Если все остальное не удалось, rewrite AddNewUploadedDocument с использованием операторов sql вместо хранимой процедуры.

+0

Я проверил хранимую процедуру, но на самом деле ее не вызывает. Там ошибка преобразует это странное значение в число при вызове proc. Я добавлю этот улов, как вы предлагаете. Операторы SQL не разрешены в нашей среде, и proc должен работать. –

Смежные вопросы