ORA-01704: слишком длинный строковый литерал при обновлении записи

Я пытаюсь обновить запись базы данных Oracle, и я продолжаю получать эту ошибку:

ORA-01704: string literal too long 5

Я просмотрел эту ошибку, и кажется, что у меня есть ограничение в 4000 чартеров, так как я использую Oracle 10g. Тем не менее, проблема заключается в том, что это те же самые данные, которые я возвращаю в эту запись, поэтому я не уверен, почему она дает мне эту ошибку для того же объема данных, который я извлек из нее.

Вот мой код обновления:

    Dim myCommand As New OracleCommand()
    Dim ra As Integer

    Try
        myCommand = New OracleCommand("Update CSR.CSR_EAI_SOURCE Set STATUS_CODE = 'Blah', COMPLETE_DATE = '', DATA = '" & theData & "' WHERE EID = '81062144'", OracleConnection)
        ra = myCommand.ExecuteNonQuery()
        OracleConnection.Close()
    Catch
        MsgBox("ERROR" & Err.Description & " " & Err.Number)
    End Try

Я не уверен, что вам нужно сделать что-то особенное, чтобы обновить клоб или нет.

Я извлекаю clob так:

 Dim blob As OracleClob = dr.GetOracleClob(9)
 Dim theData As String = ""

 theData = blob.Value

И он отлично работает, извлекая, но просто не вставляя его обратно.

Любая помощь будет здорово!

Дэйвид

ОБНОВИТЬ КОД

 Dim OracleCommand As New OracleCommand()
 Dim myCommand As New OracleCommand()
 Dim ra As Integer

 While dr.Read()
    Dim blob As OracleClob = dr.GetOracleClob(9)
    Dim theData As String = ""

    theData = blob.Value
    theData = Replace(theData, "…", " ")

    Try
       Dim strSQL As String
       isConnected2 = connectToOracleDB2()
       OracleConnection.Close()

       If isConnected2 = False Then
           MsgBox("ERRORConn: " & Err.Description & " " & Err.Number)
       Else
           myCommand.Connection = OracleConnection2
           strSQL = "Update CSR.CSR_EAI_SOURCE Set STATUS_CODE = 'ERROR', COMPLETE_DATE = '', DATA = :1 WHERE EID = '" & theEID & "'"
           myCommand.CommandText = strSQL

           Dim param As OracleParameter = myCommand.Parameters.Add("", OracleDbType.Clob)
           param.Direction = ParameterDirection.Input
           param.Value = theData
           Application.DoEvents()

           ra = myCommand.ExecuteNonQuery()
           Application.DoEvents()
           OracleConnection2.Close()
           Application.DoEvents()
       End If
    Catch
       MsgBox("ERROR: " & Err.Description & " " & Err.Number)
       OracleConnection2.Close()
    End Try
 End While

 dr.Close()
 OracleConnection.Close()

person StealthRT    schedule 17.03.2011    source источник


Ответы (2)


Не вводите значение жестко в код SQL-запроса. Вместо этого оберните его параметром. Так:

Dim strSQL As String
strSQL = "Update CSR.CSR_EAI_SOURCE Set STATUS_CODE = 'Blah', COMPLETE_DATE = '', DATA = :1 WHERE EID = '81062144'"
myCommand.CommandText=strSQL

А потом:

Dim param As OracleParameter=myCommand.Parameters.Add("",OracleDbType.Clob)
param.Direction=ParameterDirection.Input
param.Value=blob.Value

Вы можете (и должны), конечно, добавить все другие переменные (код состояния, полную дату, eid) вашего запроса в качестве параметров, вместо того, чтобы жестко кодировать их в свой SQL.

person Tommi    schedule 17.03.2011
comment
Разве в myCommand.Parameters.Add(,OracleDbType.Clob) не должно быть :1? например: myCommand.Parameters.Add(:1,OracleDbType.Clob)? - person StealthRT; 17.03.2011
comment
Нет, я так не думаю... Первое значение в наборе параметров будет использоваться как первый параметр в запросе и так далее. - person Tommi; 17.03.2011
comment
Хорошо, теперь я получаю сообщение об ошибке: Операция недействительна из-за текущего состояния объекта? - person StealthRT; 17.03.2011
comment
Ваш объект myCommand, похоже, не связан с OracleConnection. - person Tommi; 17.03.2011
comment
Как мне решить эту проблему?? - person StealthRT; 17.03.2011
comment
Goodgreef, теперь я получаю это: CLR не удалось перейти от контекста COM 0x3337fa8 к контексту COM 0x3338118 в течение 60 секунд.... Я попытался снять флажок ContextSwitchDeadlock и запустите его, но он все равно зависнет на ra = myCommand.ExecuteNonQuery() - person StealthRT; 17.03.2011

Varchar2 в sql имеет ограничение в 4000 символов. Это ограничение не распространяется на данные, хранящиеся в столбце varchar. Вам нужно преобразовать это в pl\sql или указать другой тип столбца. (Я не эксперт по php. Поэтому я не могу предоставить образец, а только причину вашей ошибки).

По сути, вам нужно указать тип данных как clob при выполнении запроса на привязку. В противном случае по умолчанию будет использоваться varchar2, и будет применяться указанное выше ограничение.

person uncaught_exceptions    schedule 17.03.2011