【问题标题】:ORA-01704: string literal too long when updating a recordORA-01704: 更新记录时字符串文字太长
【发布时间】:2011-03-17 12:06:43
【问题描述】:

我正在尝试更新 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。

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

【问题讨论】:

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


    【解决方案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 中。

    【讨论】:

    • myCommand.Parameters.Add("",OracleDbType.Clob) 不需要有 :1 吗?比如:myCommand.Parameters.Add(":1",OracleDbType.Clob)?
    • 不,我不这么认为...参数集合中的第一个值将用作查询中的第一个参数,依此类推。
    • 好的,现在我得到一个错误:由于对象的当前状态,操作无效
    • 您的 myCommand 对象似乎没有与 OracleConnection 关联。
    • 我该如何解决这个问题??
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多