PLS-00306:调用现有存储过程时参数的数量或类型错误

时间:2010-01-29 09:25:34

标签: sql oracle stored-procedures plsql

我在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()因上述错误而失败。 如果你需要知道“绑定”调用的样子,请告诉我。我立刻粘贴它们,因为代码块非常大。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

首先,函数不是一个过程 - 但这不是问题。由于您使用了正确数量的参数,唯一可能的是您使用的自定义类型的实现在Oracle和C之间不匹配。它们是如何在PL / SQL中定义的?