0

初めて Oracle DB の LOB にアプローチし、困惑したものに出くわしました。

テーブルに挿入する行の列にBLOBを挿入する必要がありますPro*Cドキュメントには、2 つの選択肢があると書かれています。

  1. バッファに収まる場合は、一度にすべてのロブを書き込みます。EXEC SQL WRITE ONE
  2. バッファが小さすぎる場合は、ドキュメントでpollingと呼ばれるものを使用して、次の 3 つの手順からなるシーケンスでlob を少しずつ書き込みます。

    1. EXEC SQL WRITE FIRST
    2. EXEC SQL WRITE NEXTn回
    3. EXEC SQL WRITE LAST

しかし、ドキュメントに示されているポーリング方法を単純に n+2 回に置き換えることができることがわかりました。これによりEXEC SQL WRITE APPEND、ループがはるかに単純で直感的になり、エラー処理がより簡単になります。

したがって、このようなものを書く代わりに (ドキュメントから取得):

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;
}

問題に気付かずに2番目のアプローチを徹底的にテストしたので、疑問が残りました:

  1. 私の注意を無視する2番目のアプローチに何か問題がありますか?
  2. 2 番目のアプローチのように進めても問題ない場合、ドキュメントで説明されているような 3 つのステップからなるポーリング メカニズムの必要性は何ですか?
4

1 に答える 1

0

LBS (LOB Buffering Subsystem) を使用して適切なバッファリングを使用すると、いくつかの利点が得られる場合があります。オラクルは説明します-

バッファリングには、特に LOB の特定の領域に対して多数の小規模な読み取りと書き込みを行うクライアント上のアプリケーションの場合に、次の利点があります。

  1. LOB への複数の読み取り/書き込みでバッファーを満たし、FLUSH ディレクティブが実行されたときにサーバーに書き込むため、LBS はサーバーへのラウンドトリップを減らします。

  2. バッファリングにより、サーバー上の LOB 更新の総数も減少します。これにより、LOB のパフォーマンスが向上し、ディスク領域が節約されます。

リンクのセクションまでスクロールして、LOB Buffering Subsystem詳細をお読みください。

于 2012-10-04T14:23:39.577 に答える