更新CLOB后的ORA-3113

时间:2015-05-07 13:13:40

标签: c oracle lob embedded-sql

我正在尝试熟悉在Oracle中使用LOB(来自应该迁移的RdB)。当我尝试使用名为AN.BEMERKUNG的CLOB列对现有条目进行更新时,我现在面临一个问题:

代码提取:

OCIClobLocator *clob ;
long           bufsize=20, start=1 ;
long           anz_inserted=0, anz_to_insert=0 ;
long           len ;
char           buffer[20], *ptr ; 

ptr          = new_value ;      // char *new_value, allocated
anz_inserted = 0 ;
len          = strlen(new_value)+1 ;
EXEC SQL ALLOCATE :clob ;
EXEC SQL SELECT NVL(bemerkung, EMPTY_CLOB()) INTO :clob FROM AN WHERE AN.ID = :(an_ptr->an_id) ;
while (anz_inserted < len)
{
   anz_to_insert = len-anz_inserted>bufsize?bufsize:len-anz_inserted ;
   memcpy(buffer, ptr, anz_to_insert) ;
   if (anz_inserted == 0)
   {
      if (len == anz_to_insert)
      {
         EXEC SQL LOB WRITE ONE :len FROM :buffer INTO :clob at :start ;
      }
      else
      {
         EXEC SQL LOB WRITE FIRST :anz_to_insert FROM :buffer INTO :clob at :start ;
      }
   }
   else
   {
      if (anz_inserted + anz_to_insert < len)
      {
         EXEC SQL LOB WRITE NEXT :anz_to_insert FROM :buffer INTO :clob ;
      }
      else
      {
         EXEC SQL LOB WRITE LAST :anz_to_insert FROM :buffer INTO :clob ;
      }
   }
   anz_inserted += anz_to_insert ;
   ptr          += anz_to_insert ;
}

在我尝试提交的那一刻,一切正常。然后我收到消息:

  

从提交

返回sqlcode -3113      

SQL错误消息:ORA-03113:通信通道上的文件结尾

我在RHEL上使用Oracle 11。该程序直接在DB所在的平台上运行。 我正在使用这个20的小缓冲区仅用于测试目的,强制程序分几步构建CLOB。

有人知道这个错误可能是由什么造成的吗?

提前多多感谢 最好的祝愿 约尔格

1 个答案:

答案 0 :(得分:0)

通常,当您收到ORA-03113错误时,表示与数据库的连接意外终止,客户端(您的程序)无法再与数据库通信。

因此,错误(显然)发生在服务器端。因此,请检查ORA-03113错误时间周围的警报日志,并查看当时警报日志中是否有任何错误。那应该会给你一个根本原因的线索。

希望有所帮助。