1

Oracleのドキュメントを理解できません。:-(

OCIを介してOracleから単純なデータの複数の行をフェッチする方法を知っている人はいますか?

私は現在OCIDefineByPos、単一の変数を定義するために使用し(単純な整数- SQLT_INT/ 4バイトの整数に対してのみこれを行う必要があります)、次にOCIStmtExecute/を使用して一度に単一の行をフェッチしOCIStmtFetch2ます。

これは少量のデータでは問題ありませんが、1行あたり約0.5ミリ秒かかるため、数万行を読み取る場合は遅すぎます。

のドキュメントがわかりませんOCIBindArrayOfStruct。一度に数千行をフェッチするにはどうすればよいですか?

4

2 に答える 2

3

$ORACLE_HOME/oci/samples のサンプル コードを確認しましたか (インストールしていない場合は、Oracle インストーラーを実行して、サンプル コードをインストールするように指示してください)。バルク インターフェイスを使用するものがいくつかあります。

代わりにライブラリの使用を真剣に検討することをお勧めします。私は Pro*C (大嫌い)、ストレートな OCI をコーディングし、サードパーティのライブラリを使用しました。ラストは大差で最高です。OCI 構文は非常に複雑で、おそらく使用することのないオプションがあります。同時に、非常に厳格で、少しでも間違ったことをするとコードがクラッシュします。

C++ を使用している場合は、OTLをお勧めします。私はいくつかの深刻なパフォーマンス テストを行いましたが、OTL は一般的な場合のハンド コーディングと同じくらい高速です (データに NULL がなく、したがってインジケーターが必要ないことが確実にわかっている場合は、OTL を 5 ~ 10% 上回ることができます)。アレイ)。注 -- OTL コードを理解しようとしないでください。それはかなり恐ろしいです。しかし、それは本当にうまく機能します。

また、OCI をラップして使いやすくし、かみつく可能性を低くする C ライブラリも多数ありますが、私はそれらのいずれもテストしていません。

他に何もないとしても、OCI コードのラッパー関数を記述して作業を容易にしてください。これをハイ パフォーマンス シナリオで実行したところ、発生した問題の数が大幅に減少しました。

于 2008-09-19T14:09:23.080 に答える
3

OCIDefineArrayOfStructレコードの配列のフェッチをサポートするために使用できます。これを行うには、配列のベースを に渡し、OCIDefineByPosを使用OCIDefineArrayOfStructして Oracle にレコードのサイズ (スキップ サイズ) を伝えます。OCIFetch次に、配列サイズをフェッチするように 呼び出していると思います。

OCI_ATTR_PREFETCH_ROWS別の方法として、実行前にステートメント属性 を設定することもできます。これにより、一度にフェッチする行数が Oracle に通知されます。デフォルトは 1 です。このアプローチを使用すると、Oracle はラウンド トリップを減らし、行をバッファします。

OCIBindArrayOfStructDML ステートメントで使用されます。OCIDefineArrayOfStructバインド変数で機能することを除いて、 と同様に機能します。

サンプル コードは、Oracle の Web サイトで見つけることができます。

于 2008-09-28T21:31:17.503 に答える