有关写clob

greenweather 2012-02-17 10:16:47

char sbillpic1data_Value_Buff[STAMPBUFFLEN+1];
OCIClobLocator *sbillpic1data_VALUE;

char sbillpic2data_Value_Buff[STAMPBUFFLEN+1];
OCIClobLocator *sbillpic2data_VALUE;
EXEC SQL insert into dbtsend_list (BILLPIC1DATA, BILLPIC2DATA) values (empty_clob(),empty_clob());
EXEC SQL ALLOCATE :sbillpic1data_VALUE;
EXEC SQL SELECT BILLPIC1DATA INTO :sbillpic1data_VALUE FROM dbtsend_list
where LISTID = :slistid;
writeClob(sbillpic1data_VALUE, sbillpic1data_Value_Buff);
EXEC SQL FREE :sbillpic1data_VALUE;



EXEC SQL ALLOCATE :sbillpic2data_VALUE;
EXEC SQL SELECT BILLPIC2DATA INTO :sbillpic2data_VALUE FROM dbtsend_list
where LISTID = :slistid;
writeClob(sbillpic2data_VALUE , sbillpic2data_Value_Buff);
EXEC SQL FREE :sbillpic2data_VALUE;

//附上writeClob
void CEntityBase::writeClob(OCIClobLocator *p_clob, const char* buff)
{
bool last = FALSE;
int remainder;

EXEC SQL BEGIN DECLARE SECTION;
OCIClobLocator *clob;
varchar *lvr;
int amt, nbytes;
int offset = 1;
EXEC SQL END DECLARE SECTION;

int len = strlen(buff); //+ 1;
clob = p_clob;
amt = len; /* Determine the Buffer Size and Allocate the LONG VARRAW Object */
int bufsize = 2048;
char* tmp = new char[2 + bufsize];
memset(tmp, 0, 2+bufsize);
lvr = (varchar *)tmp;
nbytes = (len > bufsize) ? bufsize : len;
memcpy(lvr->arr, buff, nbytes);
lvr->len = nbytes;
remainder = len - nbytes;
if (remainder == 0)
{
// ACE_DEBUG((LM_DEBUG, "write in a single piece\n")); /* Write the BLOB in a Single Piece */
printf("0amt:[%d], lvr:[%s], nbytes:[%d], clob:[%s]\n", amt, lvr, nbytes, clob);
EXEC SQL LOB WRITE ONE :amt
FROM :lvr WITH LENGTH :nbytes INTO :clob AT :offset;
}
else
{
/* Write the BLOB in Multiple Pieces using Standard Polling */
printf("2\n");
EXEC SQL LOB WRITE FIRST :amt
FROM :lvr WITH LENGTH :nbytes INTO :clob AT :offset;
// ACE_DEBUG((LM_DEBUG, "write first\n"));
do
{
if (remainder > bufsize)
nbytes = bufsize;
else
{
nbytes = remainder;
last = TRUE;
}
memcpy(lvr->arr, buff + len - remainder, nbytes);
lvr->len = nbytes;
printf("3\n");
if (last)
{
/* Write the Final Piece */
EXEC SQL LOB WRITE LAST :amt
FROM :lvr WITH LENGTH :nbytes INTO :clob;
// ACE_DEBUG((LM_DEBUG, "write last\n"));
}
else
{
/* Write an Interim Piece - Still More to Write */
EXEC SQL LOB WRITE NEXT :amt
FROM :lvr WITH LENGTH :nbytes INTO :clob;
// ACE_DEBUG((LM_DEBUG, "write middle\n"));
}

remainder -= nbytes;
}
while (!last);
}

delete[] tmp;
}


写一个clob是可以的,写2个或者多个就会有问题,加入第一个是123456,第二个是654,存入数据库后,第一个是654456,第二个是654,第二个覆盖了第一个,请大家指点感谢
...全文
93 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
greenweather 2012-03-18
  • 打赏
  • 举报
回复
后来发现是AIX的栈空间有限制,只能开600K,char sbillpic1data_Value_Buff[STAMPBUFFLEN+1];一个字段就超过400K,就coredump了
greenweather 2012-02-17
  • 打赏
  • 举报
回复
不能commit,commit后后面的都是空值了
一叶之舟 2012-02-17
  • 打赏
  • 举报
回复
第一次入库后先提交,再执行第二次。
龙行天下之Sky 2012-02-17
  • 打赏
  • 举报
回复
加入第一个是123456,第二个是654,
是不是用的同一个空间的原因啊?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧