ORA-01704: слишком длинный строковый литерал при обновлении записи - PullRequest
2 голосов
/ 17 марта 2011

Я пытаюсь обновить запись базы данных 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

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

Любая помощь будет отличной!

David

КОД ОБНОВЛЕНИЯ

 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()

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Не указывайте значение в вашем 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.

0 голосов
/ 17 марта 2011

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

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

...