Snippet :一个外部C dll,它从PLSQL接收一个集合(嵌套数字表)并进行一些处理(代码中未显示)。
问题:当从PLSQL(在PLSQL中创建的库和包装器)调用此外部C函数时,数组中的C函数接收(在堆栈上) )。但是,如果我取消注释动态数组(在Heap上)的注释行而不是静态,则调用将失败并显示:
ORA-28579: network error during callback from external procedure agent.
#define ARRSIZE 107
extern "C" __declspec(dllexport) int ooci_ntm(OCIExtProcContext *context, OCITable* clients)
{
OCIEnv *envhp;
OCISvcCtx* svch;
OCIError *errhp;
double onumm[ARRSIZE]; //Works if its a static array on stack
//double* onumm= (double*)malloc(sizeof(double) * ARRSIZE);
//However, if instead of the above array if the memory is allocated dynamically on heap then the captioned error is thrown.
sword status;
boolean exist;
uword nelems;
OCIExtProcGetEnv (context, &envhp, &svch, &errhp);
OCINumber **client_elem = (OCINumber**)malloc(sizeof(OCINumber*) * ARRSIZE);
status = OCICollGetElemArray(envhp, errhp, clients, index, &exist, (void**)client_elem, (dvoid **)0, &nelems);
status = OCINumberToRealArray(errhp,(const OCINumber**)client_elem,nelems,sizeof(double),(void*)onumm);
free(client_elem);
//free(onumm);
return size;
}
答案 0 :(得分:0)
看起来这是其中一个错误,实质上意味着外部程序可能出现任何问题。
10.2.0.3中存在一个已知错误,不知道它是否相关:
尝试选择时发生ORA-28579 来自流水线表函数的数据 用“C”实现 ODCITable / ANYDATASET接口。 ODCITableDescribe工作正常但是 ODCITableFetch生成ORA-28579 错误。
尝试联系Oracle支持