4

CLOBstd::vectorから OCCI 経由でデータを読み取ります。単純化されたコードは次のようになります。

oracle::occi::Clob clob = result.getClob( 3 );
unsigned len = clob.length();
std::vector< unsigned char > result( len );
unsigned have_read = clob.read( len , result.data() , len );

これにより、エラー ORA-32116 が発生し、バッファ サイズ (read の 3 番目の引数) は、読み取るデータの量 (read の 1 番目の引数) と同じかそれ以上である必要があります。この条件は明らかに保たれています。

バッファー サイズを 4*len に増やした後:

unsigned have_read = clob.read(len , result.data() , 4 * len);

操作は適切に行われます。これまで、 と の値have_readlen常に同じでした。

文書化されていない余分なスペースがバッファーに必要ですか? それとも完全なページが必要ですか?

「Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit」を使用しています。

このトピックに関する説明は大歓迎です。

4

1 に答える 1

2

CLOB にマルチバイト文字が含まれていると思われます。

ドキュメントによると、 「 は"clob.length() の文字数を返しますがCLOB、 のbuffsizeパラメータはclob.read()"有効な値は " 以上の数値amtあり、それは"読み取られるバイト数" であると述べています。

言い換えれば(そしてドキュメントによると)clob.read()、バイト数を期待しているときに文字数を渡しています。エラーが発生しているという事実は、前者が後者よりも小さいことを示唆しています。

ドキュメントでは、バッファを に変更することを提案しています。utext文字セットを設定した後、setCharSetId()それを修正します。

または、マルチバイト文字があり、文字表現を行う必要がない場合 (わかりません)、代わりに BLOB を使用する価値があるかもしれません。blob.length()バイト数を返します

于 2015-07-25T13:00:59.887 に答える