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

发布于 2024-10-23 21:00:48 字数 2277 浏览 5 评论 0原文

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

ORA-01704: string literal too long 5

我查找了该错误,似乎由于我使用 Oracle 10g,因此我有 4000 个包机的限制。然而,问题是,它与我放回到该记录中的数据完全相同,所以这就是为什么我不确定为什么它给我的错误与我从中取出的相同数量的数据有关。

这是我的更新代码:

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

I am trying to update an Oracle Database record and i keep getting this error:

ORA-01704: string literal too long 5

I looked up that error and it seems that i have a limit of 4000 charters since i am using Oracle 10g. However, the prgblem is that its the same exact data i am putting back into that record so that is why i am unsure as to why its giving me that error for the same amount of data i took out of it.

Here is my update code:

    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

I'm not sure if there is anything special you have to do in order to update a clob or not.

I extract the clob like so:

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

 theData = blob.Value

And it works just fine extracting but just not putting it back in.

Any help would be great!

David

UPDATE CODE

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

雄赳赳气昂昂 2024-10-30 21:00:48

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

Do not hardcode the value into your SQL query. Instead wrap it in a parameter. Like this:

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

And then:

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

You can (and should) of course add all other variables (status code, complete date, eid) of your query as parameters, too, instead of hard-coding them into your SQL.

菊凝晚露 2024-10-30 21:00:48

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

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

Varchar2 in sql has a limitations of 4000 characters. This limitation does not apply to the data stored in a varchar column. You need to convert this to pl\sql or specify some other column type. ( I am not a php expert. So I cannot provide any sample, just the reason for your error).

Essentially you need to specify the data type as clob while executing the bind query. Otherwise it will default to varchar2 and the above limitation will apply.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文