2010-01-29 46 views
2

我在C代碼中使用現有的存儲過程。 有問題的存儲過程已被編譯並且經過驗證可正常工作。但是,當我在我的C代碼中使用相同的代碼時,它會因上述錯誤而失敗。PLS-00306:調用現有存儲過程時參數的數量或類型錯誤

的存儲過程的定義是這樣的:

CREATE OR REPLACE FUNCTION SP( 
    srq_id   integer , 
    unid   IN SPkg.arr_parmid, 
    parm_typ  IN SPkg.arr_parm_typ, 
    parm_lbl  IN SPkg.arr_parm_lbl, 
    parm_vlu  IN SPkg.arr_parm_vlu, 
    commit_flag  INTEGER DEFAULT 1, 
    vlu_hint  IN SPkg.arr_vlu_hint, 
    create_flag  INTEGER DEFAULT 0) 
RETURN INTEGER 

類型定義

TYPE arr_parm_typ IS TABLE OF char INDEX BY BINARY_INTEGER; 
TYPE arr_parmid IS TABLE OF tbl_parm.UNID%TYPE INDEX BY BINARY_INTEGER; 
TYPE arr_parm_lbl IS TABLE OF tbl_parm.PARM_LBL%TYPE INDEX BY BINARY_INTEGER; 
TYPE arr_parm_vlu IS TABLE OF tbl_parm.PARM_VLU%TYPE INDEX BY BINARY_INTEGER; 
TYPE arr_vlu_hint IS TABLE OF tbl_parm.VLU_HINT%TYPE INDEX BY BINARY_INTEGER; 

我的C代碼如下所示:

typedef struct param 
{ 

    char lbl[30][81]; 
    char vlu[30][256]; 
    char typ[30]; 
    ub8 seq_no[30]; 
    char vlu_hint[30]; 

}PARAM; 

ub8 srqid; 
int commit_flag; 
int create_flag; 
PARAM p_array; 

我調用存儲過程的方式:

char command[250] = "begin :retval := SSP_srq_parm_all(:srq_id,:unid,:parm_typ,:parm_lbl,:parm_vlu,:commit_flag,:vlu_hint,:create_flag); end;"; 
    OCIStmtPrepare2((OCISvcCtx *)svchp, (OCIStmt **)&(stmthp), 
       (OCIError *)errhp, (OraText *)command, 
       (ub4)strlen((char*)command), (OraText *)NULL, (ub4)0, 
       OCI_NTV_SYNTAX, OCI_DEFAULT); 

    //..... calls to OCIBindByName & OCIBindArrayOfStruct here.......... 

    status= OCIStmtExecute(svchp, stmthp,errhp, (ub4)1, (ub4) 0,(CONST OCISnapshot *) NULL,(OCISnapshot *) NULL, OCI_DEFAULT); 

OCIStmtExecute()失敗,出現上述錯誤。 如果您需要了解「綁定」電話的外觀如何,請讓我知道。我馬上粘貼它們,因爲代碼塊非常大。 有人可以幫忙嗎?

+0

您可以使用代碼塊代碼塊,因爲這是很難閱讀。 還顯示那些SPkg.arr_parmid和類似的類型定義。 – Calmar 2010-01-29 09:48:55

+0

我已經添加了代碼塊,但@lavanya需要返回類型定義 – ninesided 2010-01-29 09:56:28

+0

我真的很想看到從C調用函數的代碼部分。我所看到的只是一個查詢字符串,但是不能全部存在。 – 2010-01-29 09:59:39

回答

1

首先,函數不是一個過程 - 但這不是問題。由於您使用了正確數量的參數,因此唯一可能的是您正在使用的自定義類型的實現在Oracle和C之間不匹配。它們在PL/SQL中如何定義?

+0

感謝您的意見/答案傢伙。欣賞它。我編輯了代碼片段以顯示如何調用存儲過程。我使用OCI調用來準備和執行PL SQL存儲過程。請讓我知道是否需要「綁定」調用的定義。我馬上添加它們,因爲這段代碼非常龐大。 – lavanya 2010-02-01 05:41:24

相關問題