2012-08-01 80 views
0

我在oracle中有一個存儲過程,看起來像這樣:調用一個Oracle存儲過程返回一個強大的記錄類型

PROCEDURE get_protection_details ( 
      i_case_key  IN NUMBER, 
      i_eff_dt  IN DATE, 
      protection_rec OUT protection_rectype 
     ) 

輸出參數的類型記錄 - 宣佈在包這樣的:

TYPE crms_protection_rectype IS RECORD (
    active_protection_flag VARCHAR2(1) := NULL, 
    protection_type  VARCHAR2(30) := NULL, 
    term     VARCHAR2(30) := NULL, 
    protection_fee_name VARCHAR2(30) := 'PROTECTION' 
); 

我想從VB6稱之爲 - 這裏是我的代碼有

Dim adoCMD As Object 
Dim rs as ADODB.recordset 

Set adoCMD = CreateObject("ADODB.Command") 
adoCMD.ActiveConnection = Me.Cn 
adoCMD.CommandText = "fdp$product.get_protection_details" 
adoCMD.CommandType = adCmdStoredProc 
adoCMD.Parameters.Append adoCMD.CreateParameter("i_case_key", adDouble, adParamInput, 32000, plCaseKey) 
'//this case key is type long and value is 20305003' 
adoCMD.Parameters.Append adoCMD.CreateParameter("i_eff_dt", adDate, adParamInput, 32000, Format(Now(), "DD/MM/YYYY")) 
rs = adoCMD.Execute 

我得到一個錯誤說不正確的參數數量 - 把我的頭髮扯到應該很容易的東西上 - 你如何調用一個存儲過程返回一個定義的記錄類型?

無處不在,以這種方式返回弱光標。

有沒有辦法在vb6中以某種方式定義記錄?

回答

1

這裏的問題是,您尚未定義輸出參數。

adoCMD.Parameters.Append adoCMD.CreateParameter("protection_rec", adXXXX, adParamOutput, nnnnn) 

唯一的是,我不知道你是否可以做到這一點,以及什麼類型。也許adLongVarBinary會起作用,並且您將不得不從所產生的緩衝區中複製數據塊。

爲什麼你不能簡單地返回數據作爲標準的記錄,即改變你的存儲過程執行以下操作:

SELECT active_protection_flag, protection_type, term, protection_fee_name 

如果有一個很好的理由不改變你的存儲過程的界面,也許你可以創建一個包裝存儲過程,它將輸出參數轉化爲一個SELECT語句。

+0

感謝您的回答,您對問題的正確性。我無法使用任何標準adxxxx來定義退貨。我想沒有辦法直接做到這一點。我沒有編寫oracle部分,我必須讓那個人適當地更新存儲過程。謝謝您的幫助 – Ralph 2012-08-02 00:30:58

相關問題