3

Linux、Solaris、AIX、および HP/UX で実行され、Pro*C を使用して Oracle データベースに接続する C++ で記述されたコンポーネントの広範なコレクションを維持しています。多くの動的 SQL を実行するコンポーネントを作成しようとしています。その機能をOCCIを使用して実装したいと考えています。すべてのコンポーネントの基本クラスは、ごく普通の Pro*C を使用してデータベースへの接続を作成します。

EXEC SQL CONNECT :user IDENTIFIED BY :password AT :alias USING :name;

またalias、将来のすべての Pro*C コードでデータベースと対話するために使用されます。

これから OCCI 接続を取得して、基本クラスの実装をそのままにして、コンポーネントで OCCI を使用することはできますか?

4

1 に答える 1

1

tl;dr: Pro*C 接続を OCCI で再利用することはできませんが、 OTLでは接続の再利用がサポートされています。

Pro*C ランタイム ライブラリは、OCI API を内部的に使用します。Oracle は、現在使用されている OCI ハンドルを取得する方法を文書化しています。

プリコンパイラ アプリケーションは、OCI ハンドルを抽出し、OCI 関数を直接呼び出すことができます。ただし、返される可能性のある「実行中」エラーをプリコンパイラが処理できないため、ノンブロッキング モードはサポートされていません。(OracleのPro*Cプログラマーズ・ガイド、11.2g)

埋め込まれた CONNECT 文の後に OCI ハンドルを取得できます。

詳細については、SQLEnvGet()/SQLSvcCtxGet()関数を参照してください。

OCCIも内部的にOCIを使用していますが、既存のOCIハンドルから「開始」する方法は提供していません。OCCIに接続すると、OCIハンドルを取得するためのメソッドのみが提供されます。

OCCI とは対照的に、OTL では既存の OCI ハンドルから開始できます。OCCI と同様に、C++ の動的 SQL に便利な API を提供します。さらに、OCCI とは異なり、ヘッダーのみ (C++ コンパイラ/STL の問題はありません)、オープンソース、移植性があり、その API は OCCI よりも優れた設計になっています。したがって、OCI/Pro*C よりも高いレベルで Oracle とやり取りしたい場合は、間違いなく OCCI よりも優れた代替手段となります。

于 2013-08-11T11:27:20.540 に答える