Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql PLS-00306:调用现有存储过程时参数的数量或类型错误_Sql_Oracle_Stored Procedures_Plsql - Fatal编程技术网

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

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_

我在C代码中使用了一个现有的存储过程。 所讨论的存储过程已经编译,并被证明可以正常工作,没有任何错误。然而,当我在我的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;
类型定义

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存储过程。请告诉我是否需要“绑定”调用的定义。我不能马上添加它们,因为这段代码相当庞大。