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