EXEC SQL LOB WRITE APPEND与轮询(WRITE FIRST,WRITE NEXT,WRITE LAST)

时间:2012-10-04 14:08:10

标签: c++ sql c oracle blob

第一次接近Oracle DB中的LOB并偶然发现让我困惑的事情。

我必须将 BLOB 插入到我要插入表格的行的列中,并使用 Pro*C The documentation says我有两种可能的选择。

  1. 使用EXEC SQL WRITE ONE
  2. 一起编写高手,如果它适合缓冲区
  3. 如果缓冲区太小,请使用文档调用 polling 的方式编写lob piecemeal,并按照以下3个步骤执行序列:

    1. EXEC SQL WRITE FIRST
    2. EXEC SQL WRITE NEXT n次
    3. EXEC SQL WRITE LAST
  4. 但是,我发现我可以使用EXEC SQL WRITE APPEND n + 2次替换文档中描述的民意调查方法,使循环更简单,直观,并使处理错误处理更容易。

    所以,不要写这样的东西(取自the documentation):

    if (filelen > MAXBUFLEN)
        nbytes = MAXBUFLEN ;
    else
        nbytes = filelen ;
    
    fread((void *)buffer, (size_t)nbytes, (size_t)1, fp) ;
    remainder = filelen - nbytes ;
    
    if (remainder == 0)
    {
       EXEC SQL LOB WRITE ONE :amt
           FROM :buffer INTO :blob AT :offset ;
    }
    else
    {
        EXEC SQL LOB WRITE FIRST :amt
           FROM :buffer INTO :blob AT :offset ;
    
        last = FALSE ;
        EXEC SQL WHENEVER SQLERROR DO break ;
        do
        {
            if (remainder > MAXBUFLEN)
                nbytes = MAXBUFLEN ;
            else
            {
                nbytes = remainder ;
                last = TRUE ;
            }
    
            if (fread((void *)buffer, (size_t)nbytes, (size_t)1, fp) != 1)
               last = TRUE ;
    
            if (last)
            {  
                EXEC SQL LOB WRITE LAST :amt
                    FROM :buffer INTO :blob  ;
            }           
            else
            {
                EXEC SQL LOB WRITE NEXT :amt
                    FROM :buffer INTO :blob;
            }
    
            remainder -= nbytes ;
        }
        while (!last && !feof(fp)) ;
    }
    

    人们可以这样写:

    while ((nbytes = remainder < MAXBUFLEN ? remainder : MAXBUFLEN)) 
    {
        if (fread(buffer, nbytes, 1, fp) != 1) {
            /* Handle error somehow */
            break;
        }
    
        EXEC SQL LOB WRITE APPEND :nbytes 
            FROM :buffer WITH LENGTH :nbytes INTO blob;
    
        remainder -= nbytes;
    }
    

    我彻底测试了第二种方法没有注意到任何问题所以我想知道:

    1. 出错了什么,第二种做法无法引起我的注意?
    2. 如果没有问题像第二种方法那样继续进行,那么由the documentation这三个步骤制作的轮询机制需要解释什么呢?

1 个答案:

答案 0 :(得分:0)

如果使用LBS(LOB缓冲子系统)进行适当的缓冲,可能会有一些优势。 Oracle解释说 -

  

缓冲具有这些优点,特别是对于应用程序   客户端,对特定区域进行许多小的读写操作   LOB:

     
      
  1. LBS减少了到服务器的往返次数,因为你用LOB的多次读/写填充缓冲区,然后写入   服务器执行FLUSH指令时。

  2.   
  3. 缓冲还会减少服务器上LOB更新的总数。这样可以创建更好的LOB性能并节省磁盘空间。

  4.   

滚动至链接中的LOB Buffering Subsystem部分,了解详情。