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

解决方案 »

  1.   

    给一段代码你自己去取咯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;
    }
      

  2.   

    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.   

    不会吧,已经给了代码还不愿意截代码?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;