我在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()失敗,出現上述錯誤。 如果您需要了解「綁定」電話的外觀如何,請讓我知道。我馬上粘貼它們,因爲代碼塊非常大。 有人可以幫忙嗎?
您可以使用代碼塊代碼塊,因爲這是很難閱讀。 還顯示那些SPkg.arr_parmid和類似的類型定義。 – Calmar 2010-01-29 09:48:55
我已經添加了代碼塊,但@lavanya需要返回類型定義 – ninesided 2010-01-29 09:56:28
我真的很想看到從C調用函數的代碼部分。我所看到的只是一個查詢字符串,但是不能全部存在。 – 2010-01-29 09:59:39