none
使用Excel 2000 做Oracle db查詢,會出現SQL不完整的錯誤 -- ORA-00923 RRS feed

  • 問題

  • 用Excel 2000中的ADODB物件做查詢,先給定SQL字串,在RecordSet的open方法時加入sql

    結果發現,Sql字串總是被截斷,造成ORA-00923的錯誤,是否VBA在連結DB時,Sql有字數限制?

    下方為整個按鈕事件(connectionString有將密碼、帳號與DB Source隱藏,執行時是OK)

     

    Private Sub CommandButton1_Click()
        Dim mycon As New ADODB.Connection
        Dim myRst As New ADODB.Recordset
        Dim sqlstr As String
        Dim i As Long
        Set mycon = New ADODB.Connection
        mycon.ConnectionString = "Provider=MSDAORA.1;Password='';User ID='';Data Source='';Persist Security Info=True"
        mycon.Open
        'MsgBox "連接成功"
        'mycon.BeginTrans
        sqlstr = "SELECT LINE_NAME,COUNTRY,LOAD_PORT,FULL_NAME,SUM(CAB_NO) SUMCAB_NO,SUM 

                    (SHP_FEE) SUMSHP_FEE,TO_DOOR FROM " _
                    + "(SELECT C.LINE_NAME,B.COUNTRY,A.LOAD_PORT,B.FULL_NAME,GET_CAB_NO2

                        (A.INV_NO_F) CAB_NO,A.SHP_FEE,NVL(B.CARRY_KD,'N') TO_DOOR" _
                + "FROM MSF_SHP A,PORT B,LINE C" _
                + "WHERE A.LOAD_PORT=B.PORT" _
                + "B.LINE=C.LINE" _
                + "AND A.FEE_MARK='U'" _
                + "AND A.CLS_DATE BETWEEN TO_DATE('" + TextBox1.Text + "','YYYYMMDD') AND TO_DATE('" +

                    TextBox2.Text + "','YYYYMMDD')" _
                + ")GROUP BY LOAD_PORT,FULL_NAME,LINE_NAME,COUNTRY,TO_DOOR" _
                + "ORDER BY LINE_NAME,COUNTRY"
               
        Set myRst = New ADODB.Recordset
        myRst.Open sqlstr, mycon
        Worksheets.Add
        With myRst
            For i = 1 To .Fields.Count
               ActiveSheet.Cells(1, i).Value = .Fields(i - 1).Name
            Next
            ActiveSheet.Range("A2").CopyFromRecordset myRst
            .Close
        End With
        mycon.Close
        Set myRst = Nothing
        Set mycon = Nothing
    End Sub 

     

    每次執行,sqlstr的值只會得到SELECT LINE_NAME,COUNTRY,LOAD_PORT,FULL_NAME,

    SUM(CAB_NO) SUMCAB_NO,SUM(SHP_FEE) SUMSHP_FEE,TO_DOOR FROM " _      

    +"(SELECT .LINE_NAME,B.COUNTRY,A.LOAD_PORT,B.FULL_NAME,GET_CAB_NO2

       (A.INV_NO_F) CAB_NO,A.SHP_FEE,NVL(B.CARRY_KD,'N') TO_DOOR" _
    + "FROM MSF_SHP A,PORT B,LIN

      

    2008年11月19日 上午 03:11

解答

  • 這邊是技術討論區,開發問題請到隔壁開發討論區:

    辦公室軟體與程式開發(Office System Development)
    Office Systems開發討論區。例如:VBA,VSTO,SharePoint

     

    一般來說,ODBC 限制是 64 kb ,考慮到 unicode ,最好長度在 32767 個字元內。但個別的 driver 可能有其它限制,要看你使用版本的說明才能確定。

     

    我會建議你先把你的 sqlstr 輸出,用手動方式貼到連線軟體上,看看語法是否可以通過,有的時候字串裡面包含 ' 或 ; 等,會變成 SQL 語法的一部分。

     

    而錯誤訊息一般來說沒辦法太長,通常是在 255 字元內,所以有可能是錯誤訊息被截斷也不一定。

    2008年11月19日 上午 06:19

所有回覆

  • 這邊是技術討論區,開發問題請到隔壁開發討論區:

    辦公室軟體與程式開發(Office System Development)
    Office Systems開發討論區。例如:VBA,VSTO,SharePoint

     

    一般來說,ODBC 限制是 64 kb ,考慮到 unicode ,最好長度在 32767 個字元內。但個別的 driver 可能有其它限制,要看你使用版本的說明才能確定。

     

    我會建議你先把你的 sqlstr 輸出,用手動方式貼到連線軟體上,看看語法是否可以通過,有的時候字串裡面包含 ' 或 ; 等,會變成 SQL 語法的一部分。

     

    而錯誤訊息一般來說沒辦法太長,通常是在 255 字元內,所以有可能是錯誤訊息被截斷也不一定。

    2008年11月19日 上午 06:19
  • OK

    謝謝提醒

     

    2008年11月19日 上午 07:08