2

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

2 に答える 2

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

もちろん、SQL にハードコーディングする代わりに、クエリの他のすべての変数 (ステータス コード、完了日、eid) をパラメーターとして追加することもできます (そして追加する必要があります)。

于 2011-03-17T12:44:52.290 に答える
0

SQL の Varchar2 には 4000 文字の制限があります。この制限は、varchar 列に格納されたデータには適用されません。これを pl\sql に変換するか、他の列タイプを指定する必要があります。(私はphpの専門家ではありません。そのため、サンプルを提供することはできません。エラーの理由だけです)。

基本的に、バインド クエリの実行中にデータ型を clob として指定する必要があります。それ以外の場合、デフォルトで varchar2 になり、上記の制限が適用されます。

于 2011-03-17T12:21:27.683 に答える