2011-12-22 98 views
1

我有甲骨文函數聲明爲來自VB6的Oracle函數調用。功能不是一個程序錯誤

create or replace FUNCTION CheckScan(
    pMode IN number, 
    pAgrISN in number, 
    pAgrId in varchar2, 
    pDocISN in number, 
    pRefundId in varchar2) RETURN NUMBER IS ... 

和連接到Oracle管理員像客戶端的Visual Basic 6代碼:

...

cmd.ActiveConnection = conn 
cmd.CommandText = "CheckScan" 
cmd.CommandType = 4 'adCmdStoredProc 

Dim pMode As Integer 
Dim pAgrISN As Integer 
Dim pAgrId As String 
Dim pDocISN As Integer 
Dim pRefundId As String 

pMode = 2 
pAgrISN = 12345 
pAgrId = "Some-Id" 
pDocISN = 12345 
pRefundId = "Some-id" 

cmd.Parameters.Append cmd.CreateParameter("pMode", 131, 1, 10, pMode) 
cmd.Parameters.Append cmd.CreateParameter("pAgrISN", 131, 1, 10, pAgrISN) 
cmd.Parameters.Append cmd.CreateParameter("pAgrId", 200, 1, 255, pAgrId) 
cmd.Parameters.Append cmd.CreateParameter("pDocISN", 131, 1, 255, pDocISN) 
cmd.Parameters.Append cmd.CreateParameter("pRefundId", 200, 1, 255, pRefundId) 

cmd.Execute 

這代碼結尾爲:

PLS-00221: "CHECKSCAN" is not a procedure or is undefined 

什麼是錯的這裏?功能已成功編譯。

預先感謝您!

+0

是否被連接到Oracle數據庫用戶擁有執行的功能權限?此外,該功能正在返回一個值,你捕獲它嗎? – Ollie 2011-12-22 15:53:37

+0

是的,這是一個管理員帳戶 – 2011-12-22 16:03:38

回答

3

既然你有一個函數(而不是一個過程),你必須做一些與返回值。添加以下參數:

With cmd 
    .Parameters.Append .CreateParameter("pRetval", adNumeric, adParamReturnValue) 
    .Parameters.Append .CreateParameter("pMode", adNumeric, adParamInput, 10, pMode) 
    .Parameters.Append .CreateParameter("pAgrISN", adNumeric, adParamInput, 10, pAgrISN) 
    .Parameters.Append .CreateParameter("pAgrId", adVarChar, adParamInput, 255, pAgrId) 
    .Parameters.Append .CreateParameter("pDocISN", adNumeric, adParamInput, 255, pDocISN) 
    .Parameters.Append .CreateParameter("pRefundId", adVarChar, adParamInput, 255, pRefundId) 

    .Execute 
End With 

更新:

參數的順序是相關的。它必須以返回類型開始。然後,函數的所有參數必須按照聲明的順序進行。參數的名稱是不相關的,但是因爲在內部使用了位置(和未命名的)參數。這是顯而易見的,如果你看看cmdCommandText屬性:

"{ ? = call CheckScan(?, ?, ?, ?, ?) }" 
+0

謝謝@Codo!我有重構代碼與4(返回值)參數 - 現在它返回:PLS-00306(錯誤的數字或在調用「CHECKSCAN」參數的類型)...我是否正確傳遞參數? – 2011-12-22 16:07:11

+0

@AndrewFlorko:我想你誤解了我的代碼。您需要五個參數:四個輸入參數和一個返回值。第五個參數需要有一個數字類型,因爲你的函數被聲明爲返回一個NUMBER。 – Codo 2011-12-22 16:14:17

+0

不,不,我現在有6個參數(5個輸入+ 1個返回值)。 – 2011-12-22 16:16:17

2

我不知道你是否可以自己調用一個函數。相反,我會嘗試執行一個選擇,是這樣的:

select CheckScan(:pMode, :pAgrISN, :pArgId, :pDocISN, :pRefundId) from dual; 
+0

不錯......我也想讓他也這麼做。 – Aaron 2011-12-22 15:56:37

3

這簡直是造成的,因爲你已經把它定義爲一個功能,而是要求它,彷彿它是一個過程。可以將其稱爲函數(使用SELECT),也可以使用IN OUT參數代替RETURNING

+0

謝謝@Gaius,我用4(返回值)參數重構了代碼 - 現在它返回:PLS-00306(在調用「CHECKSCAN」時參數的錯誤數量或類型)...我是否正確傳遞參數? – 2011-12-22 16:01:42

1

這個函數做什麼? Oracle對函數有一定的限制(不允許在某些情況下進行更新,等等)。 Check out this doc,並確保你沒有違反限制用戶自定義函數部分。您可能必須將其創建爲存儲過程(或將其包含在其中)。

相關問題