2014-10-20 140 views
0

我有一個簡單的Oracle過程,如下所示。我正在嘗試使用VB6調用該過程並從過程中提取輸出。使用VB6調用Oracle 11g存儲過程

CREATE OR REPLACE PROCEDURE EXTRACTTXN (reportdate IN DATE, p_recordset OUT SYS_REFCURSOR) AS 
BEGIN 
OPEN p_recordset FOR 
SELECT 
    TXN_ID, 
    TXN_ACTION, 
    TXN_STATUS, 
    TXN_DATE, 
    TXN_AMOUNT 
FROM TRANSACTIONS 
WHERE 
    TRUNC(TXN_DATE) = TRUNC(reportdate) 
END EXTRACTTXN; 

VB代碼是這樣的;

Sub FetchTransactions(ByVal ReportDate As Date, cnnMine as ADODB.Connection) 
    On Error GoTo TrapErr 
    Dim cmdMine As ADODB.Command, rsMine As ADODB.Recordset 

    cmdMine.ActiveConnection = cnnMine 
    cmdMine.CommandTimeout = 300 
    cmdMine.CommandType = adCmdStoredProc 
    cmdMine.CommandText = "EXTRACTTXN" 

    cmdMine.Parameters.Append cmdMine.CreateParameter("reportdate", adDate, adParamInput, , Format(ReportDate, "DD-MMM-YYYY")) 
    cmdMine.Parameters.Append cmdMine.CreateParameter("p_recordset", adVariant, adParamOutput) 
    Set rsMine = cmdMine.Execute 

    Do While rsMine.EOF 
     Debug.Print rsMine!TXN_ID, rsMine!TXN_ACTION, rsMine!TXN_STATUS, rsMine!TXN_DATE, rsMine!TXN_AMOUNT 
     rsMine.MoveNext 
    Loop 
    rsMine.Close 

    Exit Sub 
TrapErr: 
    MsgBox Err.Number & " - " & Err.Description, vbExclamation, App.ProductName 
End Sub 

運行代碼時,我收到以下錯誤:

ORA-06550:第1行,第7列: PLS-00306:在調用 'EXTRACTTXN' 錯號碼或類型的參數ORA-06550:第1行第7列: PL/SQL:語句被忽略

我的代碼有什麼問題嗎?感謝幫助。 Niz

回答

0

我設法得到這個排序。這主要是因爲我對Oracle及其複雜性有所瞭解。

以下是我所做的更改;

  1. 存儲過程更改。請注意,我在Where子句中更改了TRUNC(reportdate,'DD')。

    CREATE OR REPLACE PROCEDURE EXTRACTTXN (reportdate IN DATE, p_recordset OUT SYS_REFCURSOR) AS 
    BEGIN 
    OPEN p_recordset FOR 
    SELECT 
        TXN_ID, 
        TXN_ACTION, 
        TXN_STATUS, 
        TXN_DATE, 
        TXN_AMOUNT 
    FROM TRANSACTIONS 
    WHERE 
        TRUNC(TXN_DATE) = TRUNC(reportdate, 'DD') 
    END EXTRACTTXN; 
    
  2. VB代碼更改(請注意,我有一個呼叫括號內改變CommandText中,除去參數名稱,更改的日期格式DD/MMM/YYYY並取消了輸出參數)

    Sub FetchTransactions(ByVal ReportDate As Date, cnnMine as ADODB.Connection) 
        On Error GoTo TrapErr 
        Dim cmdMine As ADODB.Command, rsMine As ADODB.Recordset 
    
        cmdMine.ActiveConnection = cnnMine 
        cmdMine.CommandTimeout = 300 
        cmdMine.CommandType = adCmdStoredProc 
        cmdMine.CommandText = "{ call EXTRACTTXN}" 
    
        cmdMine.Parameters.Append cmdMine.CreateParameter(, adDate, adParamInput, , Format(ReportDate, "DD/MMM/YYYY")) 
        Set rsMine = cmdMine.Execute 
    
        Do While rsMine.EOF 
         Debug.Print rsMine!TXN_ID, rsMine!TXN_ACTION, rsMine!TXN_STATUS, rsMine!TXN_DATE, rsMine!TXN_AMOUNT 
         rsMine.MoveNext 
        Loop 
        rsMine.Close 
    
        Exit Sub 
        TrapErr: 
        MsgBox Err.Number & " - " & Err.Description, vbExclamation, App.ProductName 
        End Sub 
    

以上工作完美。

Regards,Niz

0

問題是您的VB代碼中指定的參數類型與PL/SQL代碼中指定的參數類型不匹配。問題最可能的原因是VB6中的Format函數返回Variant類型,而不是Date類型,並且Variant類型設置爲String類型。有關Format函數的更多信息,請參閱this

如果你不知道,Variant變量的設置方式是保留8個字節來告訴世界實際變量類型是什麼。因此,如果在將Format函數應用到它後傳遞了ReportDate,它將是一個Variant,它告訴世界這是一個字符串。 ADO Parameter對象可能對此感到滿意(畢竟,SQL Server很樂意將正確格式化的字符串解析爲Date字段),而Oracle則不然。在我與Oracle有限的經驗中,我發現它比SQL Server更爲驚險。

嘗試丟失格式功能,看看你是否至少得到不同的錯誤。

+0

@Bob ...謝謝你捲土重來。您對Oracle行爲的評論非常正確。 我試圖讓問題變得更簡單。我刪除了輸入參數(ReportDate),但保留了輸出參數(p_recordset)。還要刪除Oracle SP上的WHERE子句。通過使用類似的VB代碼,我嘗試了提取,現在VB發現了一個沒有錯誤編號或描述的錯誤。但是在記錄集上沒有任何數據。我的簡單需求是使用VB6從Oracle中提取數據。任何幫助將非常感激。一直在苦苦掙扎。 – Niz 2014-10-22 14:53:48

+0

好的。要使用VB6從Oracle中提取數據,請使用簡單的「SELECT * FROM SomeTable」作爲SQL命令。您需要一個ADO連接對象和一個ADO記錄集對象。您還需要知道Oracle連接的正確connectionstring值。在www.connectionstrings.com上查看與Oracle的OLE DB連接。設置您的連接對象並將其打開。然後打開記錄集對象,傳遞第一個參數的sql服務器字符串,並將連接對象作爲第二個參數傳遞。你應該得到一個包含你的數據的記錄集。 – BobRodes 2014-10-22 15:54:20

+0

請記住,這不是(重複)生產方式。存儲過程是。但一次添加一個複雜程度。首先,請正確地建立連接,並能夠通過它選擇數據。然後開始研究如何訪問存儲過程。 – BobRodes 2014-10-22 15:55:18