我试图结识在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。该程序直接在数据库所在的平台上运行。
我将这个20的小缓冲区用于测试目的,以迫使程序分几步构建CLOB。
有人知道此错误可能是由什么引起的吗?
提前谢谢
最好的祝愿
约尔格
最佳答案
通常,当您收到ORA-03113
错误时,这意味着与数据库的连接意外终止,并且客户端(您的程序)无法再与数据库通信。
因此,错误(显然)发生在服务器端。因此,请在发生ORA-03113
错误时检查警报日志,并查看当时警报日志中是否有任何错误。那应该为您提供根本原因的线索。
希望能有所帮助。
关于c - 更新CLOB之后的ORA-3113,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30102149/