gpt4 book ai didi

c++ - EXEC SQL LOB WRITE APPEND 与轮询(先写、下写、最后写)

转载 作者:行者123 更新时间:2023-11-30 17:57:34 25 4
gpt4 key购买 nike

第一次接触 Oracle DB 中的 LOB,偶然发现了一些让我困惑的事情。

我必须使用 Pro*CBLOB 插入到我要插入表中的行的列中。 The documentation says我有两个可能的选择。

  1. 如果缓冲区适合,则使用 EXEC SQL WRITE 一次性写入所有 lob ONE
  2. 如果缓冲区太小,则使用文档中所谓的轮询来分段写入 lob,并按以下 3 个步骤组成的序列:

    1. 执行 SQL WRITE FIRST
    2. EXEC SQL WRITE NEXT n 次
    3. EXEC SQL WRITE LAST

但是,我发现我可以简单地用 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. 如果可以像第二种方法一样继续,那么需要由 3 个步骤组成的轮询机制(如 the documentation)吗?解释一下?

最佳答案

如果与使用 LBS(LOB 缓冲子系统)的适当缓冲一起使用,可能会有一些优势。甲骨文解释 -

Buffering has these advantages, especially for applications on a client that does many small reads and writes to specific regions of the LOB:

  1. The LBS reduces round trips to the server because you fill the buffer with multiple reads/writes to the LOBs, then write to the server when a FLUSH directive is executed.

  2. Buffering also reduces the total number of LOB updates on the server. This creates better LOB performance and saves disk space.

滚动到链接中的 LOB Buffering Subsystem 部分以了解更多信息。

关于c++ - EXEC SQL LOB WRITE APPEND 与轮询(先写、下写、最后写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12729128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com