第一次接近Oracle DB中的LOB并偶然发现让我困惑的事情。
我必须将 BLOB 插入到我要插入表格的行的列中,并使用 Pro*C
。 The documentation says我有两种可能的选择。
EXEC SQL WRITE
ONE
如果缓冲区太小,请使用文档调用 polling 的方式编写lob piecemeal,并按照以下3个步骤执行序列:
EXEC SQL WRITE
FIRST
EXEC SQL WRITE
NEXT
n次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;
}
我彻底测试了第二种方法没有注意到任何问题所以我想知道:
答案 0 :(得分:0)
如果使用LBS(LOB缓冲子系统)进行适当的缓冲,可能会有一些优势。 Oracle解释说 -
缓冲具有这些优点,特别是对于应用程序 客户端,对特定区域进行许多小的读写操作 LOB:
LBS减少了到服务器的往返次数,因为你用LOB的多次读/写填充缓冲区,然后写入 服务器执行FLUSH指令时。
- 醇>
缓冲还会减少服务器上LOB更新的总数。这样可以创建更好的LOB性能并节省磁盘空间。
滚动至链接中的LOB Buffering Subsystem
部分,了解详情。