c - 更新 CLOB 后出现 ORA-3113

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

一切正常,直到我尝试提交,然后我收到消息:

returned sqlcode -3113 from commit

SQL error message: ORA-03113: end-of-file on communication channel

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

此错误可能是由什么原因导致的?

最佳答案

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

所以,错误(显然)发生在服务器端。所以,检查ORA-03113错误发生前后的Alert日志,看看当时的Alert日志中是否有错误。这应该可以让您了解根本原因。

关于c - 更新 CLOB 后出现 ORA-3113,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30102149/

相关文章:

sql - 将 Oracle SQL Select 转换为 PostgreSQL Select

linux - 使用 Oracle 12.1 客户端在 Linux 中迁移应用程序时在查询中添加小数秒

sql - 如何从物理文件更新 CLOB 列?

oracle - 处理非常大的文本数据和 CLOB 列

java - JBoss6 JPA : Entity with @Lob results in GenericJDBCException

c - 如何仅在连续两个冒号后显示密码输入的星号?

java - 从Java Web应用程序控制C应用程序

c中的转换

c++ - 内联函数和宏哪个更快

dependency-injection - 将横切概念实现到 LOB/DI 应用程序中