我存一个1.5G的文件没问题,大概十几分钟就完成了,存一个3.5G的文件就存不了啊
ps:表空间大小是没问题的

解决方案 »

  1.   


    我的意思是,读写3.5G文件,要使用到巨指针,否则会出错,而且出了错,你都不一定知道。ORACLE中的BLOB是支持4GB的存储的。
      

  2.   

    噢,你的考虑是有道理的,我读文件用的是64位的int,没问题的,写数据库我用的是ocilib,它有定义对应lob的结构,偏移是64位的,应该没问题,会不会是数据库什么地方设置有问题啊
      

  3.   

    一直在执行sql语句,没跳出来
      

  4.   

    你的lob写入,应该不断分片写入,能帖出你的代码片段吗?
      

  5.   


            OCI_Lob *lobData = OCI_LobCreate(cn, OCI_BLOB);
    QFile dataFileInfo(qsResourceDataFile);//源文件3.5G
    bool bOpenfile = dataFileInfo.open( QIODevice::ReadOnly );
    if( !bOpenfile ) 
    return DATABASE_ERROR;
    QDataStream dsDataRead( &dataFileInfo );
    qint64 nFileSize = dataFileInfo.size();
    if (nFileSize <= RESOURCE_ONCE_READ_SIZE)
    {
    char *pBuff = new char[ nFileSize ];
    dsDataRead.readRawData(pBuff,nFileSize);
    OCI_LobAppend(lobData,pBuff,nFileSize);
    delete [] pBuff;
    pBuff = NULL;
    }
            else
    {
    big_uint iReadTimes = nFileSize/RESOURCE_ONCE_READ_SIZE;
    big_uint iReaded = 0;
    char *pBuff = new char[ RESOURCE_ONCE_READ_SIZE ];
    for (big_uint i = 0; i<iReadTimes; i++)
    {
    dsDataRead.readRawData(pBuff,RESOURCE_ONCE_READ_SIZE);
    OCI_LobAppend(lobData,pBuff,RESOURCE_ONCE_READ_SIZE);
    iReaded += RESOURCE_ONCE_READ_SIZE;
    }
    delete [] pBuff;
            pBuff = NULL;
    qint64 iRemain = nFileSize - iReaded;
    if (iRemain > 0)
    {
    char *pRemainBuff = new char[ iRemain ];
                            dsDataRead.readRawData(pRemainBuff,iRemain);
    OCI_LobAppend(lobData,pRemainBuff,iRemain);
    delete [] pRemainBuff;
    pRemainBuff = NULL;
    }
    }
    dataFileInfo.close();
            OCI_Prepare(st,sql.toLocal8Bit().constData());
            OCI_BindLob(st,":data",lobData);
            OCI_Execute(st);//执行sql,一直没跳出来
      

  6.   

    没办法,客户的要求,他们会有4G以上的文件,只不过我机子装的是9i,只能测试4G以内的,但4G以内的却也除出了问题
      

  7.   

    大致的看了一下你的代码,似乎代码有问题。虽然我没试过ocilib库。
    直接bind这个:data,去写入lob,不知道是否可行。通常的做法是,先插入一个empty_blob(),然后去select for update, 
    OCILobOpen(svchp, errhp, blob, OCI_LOB_READWRITE), 这之后再像你上边的分片写入。
    应该没什么问题。
      

  8.   

    我确实是先插入空的blob之后,再update的,这点是没问题的,上面代码中没贴出来。
    而且1.5G能成功也说明了这一点是没问题的。
    非常感谢你的鼎力帮助!
      

  9.   

    select for update之后得到的是描述符,但是OCILobOpen打开的又是BLOB,我打开描述符一直有问题,不知道BLOB和描述符之间什么样的转换关系呢?
    能贴一下这段代码吗?