我在C代码中使用现有的存储过程。 有问题的存储过程已经过编译,并且证明可以正常运行而不会出现任何错误。但是,当我在我的C代码中使用相同的内容时,它会因上述错误而失败。
Store过程定义如下:
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 :(得分:1)
首先,函数不是一个过程 - 但这不是问题。由于您使用了正确数量的参数,唯一可能的是您使用的自定义类型的实现在Oracle和C之间不匹配。它们是如何在PL / SQL中定义的?