Sql PLS-00306:调用现有存储过程时参数的数量或类型错误
我在C代码中使用了一个现有的存储过程。 所讨论的存储过程已经编译,并被证明可以正常工作,没有任何错误。然而,当我在我的C代码中使用相同的代码时,它会由于上面的错误而失败 存储过程定义如下所示:Sql PLS-00306:调用现有存储过程时参数的数量或类型错误,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,我在C代码中使用了一个现有的存储过程。 所讨论的存储过程已经编译,并被证明可以正常工作,没有任何错误。然而,当我在我的C代码中使用相同的代码时,它会由于上面的错误而失败 存储过程定义如下所示: CREATE OR REPLACE FUNCTION SP( srq_id integer , unid IN SPkg.arr_parmid, parm_typ IN SPkg.arr_parm_typ, parm_
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
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;
类型定义
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代码看起来像:
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
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);
OCISMTEXECUTE()失败,出现上述错误。
如果您需要了解“绑定”调用的外观,请告诉我。我不能马上粘贴它们,因为代码块相当大。
有人能帮忙吗?首先,函数不是过程,但这不是问题所在。由于您使用的参数数量正确,唯一可能的是,您使用的自定义类型的实现在Oracle和C之间不匹配。它们在PL/SQL中是如何定义的?请您为代码部分使用代码块,因为这很难理解。还显示了那些SPkg.arr_parmid和类似文件的类型定义。我已经添加了代码块,但是@lavanya需要返回类型定义。我真的希望看到代码中从C调用函数的部分。我看到的只是一个查询字符串,但这不可能是全部。谢谢大家的评论/回答。谢谢。我编辑了代码片段,以显示如何准确调用存储过程。我使用OCI调用来准备和执行PL SQL存储过程。请告诉我是否需要“绑定”调用的定义。我不能马上添加它们,因为这段代码相当庞大。