64,654
社区成员
发帖
与我相关
我的任务
分享
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;
}