ORA-28579:从外部过程代理回调期间的网络错误...(堆分配的一些问题)

时间:2014-06-30 09:38:06

标签: plsql oci

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;    
}

1 个答案:

答案 0 :(得分:0)

看起来这是其中一个错误,实质上意味着外部程序可能出现任何问题。

10.2.0.3中存在一个已知错误,不知道它是否相关:

  

尝试选择时发生ORA-28579   来自流水线表函数的数据   用“C”实现   ODCITable / ANYDATASET接口。   ODCITableDescribe工作正常但是   ODCITableFetch生成ORA-28579   错误。

尝试联系Oracle支持