PLS-00306: неверный номер или типы аргументов при вызове существующей хранимой процедуры - PullRequest
2 голосов
/ 29 января 2010

Я использую существующую хранимую процедуру в моем 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 () с вышеуказанной ошибкой. Пожалуйста, дайте мне знать, если вам нужно знать, как выглядят вызовы «bind». Я не вставляю их сразу, потому что фрагмент кода довольно большой. Может кто-нибудь помочь, пожалуйста?

1 Ответ

1 голос
/ 29 января 2010

Во-первых, функция - это не процедура, но это не проблема. Поскольку вы используете правильное количество параметров, единственное, что может быть, это то, что реализация пользовательских типов, которые вы используете, не совпадает между Oracle и C. Как они определены в PL / SQL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...