pro*c中怎么正确定c变量来保存blob数据

poemsound 2012-08-20 10:48:47
pro*c中怎么正确定c变量来保存blob数据
...全文
232 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqkjj 2012-08-21
  • 打赏
  • 举报
回复
不会吧,已经给了代码还不愿意截代码?

CLOB/BLOB不能直接通过变量去读的。

varchar l_acVarBuf[ 2048 ];
OCIClobLocator *clob = 0;

// 分配一个CLOB/BLOB对象
EXEC SQL ALLOCATE :clob;

// 将CLOB/BLOB列绑定到该对象
EXEC SQL select xmldoc into :clob from ibss_xml_order
where serv_nbr=:l_acServNbr and rownum <= 1;

// 获取该CLOB/BLOB对象信息,这里主要获取它的数据长度
EXEC SQL LOB DESCRIBE :clob GET LENGTH INTO :l_iClobLen;

// 然后读取它的数据,如果缓存区不够长,则可以多次读取
EXEC SQL LOB READ :l_iClobLen FROM :clob AT :l_iOffSet INTO :l_acVarBuf;

// 释放该对象
EXEC SQL FREE :clob;
wqkjj 2012-08-20
  • 打赏
  • 举报
回复
给一段代码你自己去取咯

int GetCLOBValueToFile( char *p_pacSrc, char *p_pacTag )
{
EXEC SQL BEGIN DECLARE SECTION;
int l_iType = 0;
char l_acServNbr[ 31 ];
EXEC SQL END DECLARE SECTION;
char *p = 0;
OCIClobLocator *clob = 0;
ub4 l_iClobLen = 0;
ub4 l_iOffSet = 1;
varchar l_acVarBuf[ 2048 ];
FILE *fp = 0;
char l_acRowNames[ 1024 ];
char l_acFile[ 255 ];

/*-----------暂时不用 chenqian_2010_05_06
if( ( p = GetVarRVal( "serv_nbr" )) == NULL )
{
PushErrMsg( "YU6005", "获取变量serv_nbr对应的值出错", NULL );
RETFAIL;
}

if( strlen( p ) > 30 )
{
PushErrMsg( "YU6015", "函数GetCLOBValueToFile:错误的参数[%s]", p, NULL );
RETFAIL;
}
strcpy( l_acServNbr, p );

EXEC SQL ALLOCATE :clob;
EXEC SQL select xmldoc into :clob from ibss_xml_order
where serv_nbr=:l_acServNbr and rownum <= 1;
if( SQLERR != 0 )
{
if( atoi( p_pacTag ) == 1 && (SQLERR == 100 || SQLERR == 1403 ))
{
PushErrMsg( "YU6025", "函数GetCLOBValueToFile:提示:ibss_xml_order表无工单号[%s]对应的记录", l_acServNbr, NULL );
EXEC SQL FREE :clob;
RETOK;
}
PushErrMsg( "YU6030", "函数GetCLOBValueToFile:执行SQL失败[%d][%s]",
SQLERR, SQLMSG, NULL );
EXEC SQL FREE :clob;
RETFAIL;
}

EXEC SQL select seq_file_sequence.nextval into :l_iType from dual;
if( SQLERR != 0 )
{
PushErrMsg( "YU6035", "函数GetCLOBValueToFile:取序列[seq_file_sequence]值失败[%d][%s]",
SQLERR, SQLMSG, NULL );
RETFAIL;
}
memset( l_acRowNames, 0x00, sizeof( l_acRowNames ) );
if( (char *)getenv( "TCPATH" ) != NULL )
strcpy( l_acRowNames, getenv( "TCPATH" ) );
else
strcpy( l_acRowNames, "./" );
sprintf( l_acFile, "%s/data/data.%s.%d", l_acRowNames, _GetOperID(), l_iType );

if( NULL == ( fp = fopen( l_acFile, (const char *)"w") ))
{
PushErrMsg( "YU6040", "打开文件[%s]失败[%d][%s]",l_acFile, errno,strerror(errno), NULL );
EXEC SQL FREE :clob;
RETFAIL;
}

EXEC SQL LOB DESCRIBE :clob GET LENGTH INTO :l_iClobLen;
while( 1 )
{
memset( l_acVarBuf.arr, 0x00, sizeof(l_acVarBuf.arr) );
EXEC SQL LOB READ :l_iClobLen FROM :clob AT :l_iOffSet INTO :l_acVarBuf;
if( SQLERR == 1403 || SQLERR == 100 )
break;
if( SQLERR != 0 )
{
PushErrMsg( "YU6045", "读取CLOB类型数据失败[%d][%s]", SQLERR, SQLMSG, NULL );
EXEC SQL FREE :clob;
fclose(fp);
RETFAIL;
}
fprintf( fp,"%s", (char *)l_acVarBuf.arr );
}
fprintf(fp,"%s",(char *)l_acVarBuf.arr);
EXEC SQL FREE :clob;
fclose( fp );

if( UpdateVarRVal( "file_flag", "1" ) < 0 )
{
PushErrMsg( "YU6050", "函数GetCLOBValueToFile语句[%s]更新变量[file_flag]值[1]失败",
p_pacSrc, NULL );
RETFAIL;
}
if( UpdateVarRVal( "file_path", l_acFile ) < 0 )
{
PushErrMsg( "YU6055", "函数GetCLOBValueToFile语句[%s]更新变量[file_path]值[%s]失败",
p_pacSrc, l_acFile, NULL );
RETFAIL;
}
*/
RETOK;
}
poemsound 2012-08-20
  • 打赏
  • 举报
回复
EXEC SQL BEGIN DECLARE SECTION;
char buf[5000];
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE mnt_cur SCROLL CURSOR FOR
SELECT mnt
FROM fp_01;
EXEC SQL OPEN mnt_cur;
EXEC SQL FETCH FIRST mnt_cur INTO
:buf;
printf("\n%d",sqlca.sqlcode);
这是摘出来的代码,mnt是blob数据,这样出来返回值是<0,求详解啊!buf应该怎么定义啊!!谢谢啦!

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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