pro*c中怎么正确定c变量来保存blob数据 pro*c中怎么正确定c变量来保存blob数据 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给一段代码你自己去取咯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;} 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应该怎么定义啊!!谢谢啦! 不会吧,已经给了代码还不愿意截代码?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_orderwhere 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; 求助:oracle 11g database control 证书错误 oracle imp问题? oracle数据库是否可以获取对一张表的所有增删改查操作历史记录,如何获取? 如果按照百分比排序? 提个帐户的问题啊 这样的SQL语句怎么写? 我用Enterprise Manager Configuration Assistant创建资料库时发生错误,求救 关于Oracle的数据类型问题? Date 的問題 insert into 效率极其慢, 3000多条数据新增所需 19 分钟 求助:在局域网中,用PL/SQL可以连接oracle数据库,但查看表结构和执行sql就假死 大量数据导入
{
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;
}
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应该怎么定义啊!!谢谢啦!
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;