ORA-01704:更新记录时字符串文字太长

时间:2011-03-17 12:06:43

标签: vb.net oracle visual-studio-2010 oracle10g clob

我正在尝试更新Oracle数据库记录,并且我不断收到此错误:

ORA-01704: string literal too long 5

我查了那个错误,似乎我有40个章程限制,因为我使用的是Oracle 10g。然而,prgblem是它与我记录的相同的确切数据,所以这就是为什么我不确定为什么它给我这个错误的相同数量的数据我拿走了它。

这是我的更新代码:

    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。

我像这样提取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()

2 个答案:

答案 0 :(得分:1)

不要将值硬编码到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中。

答案 1 :(得分:0)

sql中的Varchar2有4000个字符的限制。此限制不适用于存储在varchar列中的数据。您需要将其转换为pl \ sql或指定其他列类型。 (我不是一个php专家。所以我不能提供任何样本,只是你错误的原因)。

实际上,您需要在执行绑定查询时将数据类型指定为clob。否则它将默认为varchar2,并且将适用上述限制。