2020.12.12 Saturday
OCIといえばOracle Call Interface
OCIといえばOracle Call Interface
この記事は、 JPOUG Advent Calendar 2020 12日目の記事です。
#11日目は tomoさんの記事でした(はず)。
すでに、OCIといえばOracle Cloud Infrastructureになりつつあるので、備忘録的に。
木村は主にOracle 7.xの時代に、今は無き(あるある)ジャストシステムにて、五郎というデータベースの開発にかかわっていました。主に五郎から他のデータベースに接続するドライバのうちOracleに接続するためのドライバをOCI7で作成し、Accessに接続するためにODBCドライバを作成していました。
1.OCI(Oracle Call Interface)とは何?
いわゆるネイティブ接続に利用するC言語ライブラリです。公式説明はこちら。
直接ワイヤプロトコルを話すドライバ以外は、基本このOCIを経由して、Oracleとやりとりします。
2.OCIの種類。OCIとOCI80
OCIはOracle 7まで利用されていたOCIと、Oracle 8以降に提供されたOCI80があり、現在では(おそらく)OCIといえばOCI80を指すと思います。
OCIは良くも悪くもC言語べったりのライブラリで、低レベルなAPIを提供していましたが、古いタイプのBLOB/CLOB(LONG/LONG RAW)の効率的な扱いも難しく、また新しいタイプのBLOB/CLOBには対応していませんでした。
そこでOracle 8からBLOB/CLOBに対応し、低レベルながらも、もう少しアプリケーションを組むのに優しい(ODBC的な)OCI80が登場しました。以降はこれが拡充され、OCIと呼ばれているはず、です。
(最初登場したときのディレクトリ名がOCI80だったので、それが慣用的に使われていたのかも)
比較的最近(Oracle 12c)の「Oracle Call Interface プログラマーガイド」では、Oracle 7まで利用されていたOCIを
OCIリリース7.3, Oracle 8からサポートされたものをOCIリリース8.0と呼んでいます。
3.7.4 使用されなくなったOCIルーチン
OCIリリース7.3のAPIは、小文字oからはじまるAPIで、
OCIリリース8.0のAPIは、大文字OCIからはじまるAPIになります。
例えばトランザクションのコミットは以下のような関数の呼び出しになります。
OCIリリース7.3: ocom()
OCIリリース8.0: OCITransCommit()
3.OCIとOCCI
木村は利用したことはないのですが、OCCI(Oracle C++ Call Interface)があります。OCCIは、Application Program Interface(API)の1つでOCCIを使用すると、C++言語で作成したアプリケーションからOracleデータベース内のデータにアクセスできます。
Oracle C++ Call Interfaceプログラマーズ・ガイド, 12cリリース2 (12.2)
「JDBCの知識がある場合は容易に習得できます」とのことなので、MySQLのConnector/C++的な立ち位置のようです。
この記事は、 JPOUG Advent Calendar 2020 12日目の記事です。
#11日目は tomoさんの記事でした(はず)。
すでに、OCIといえばOracle Cloud Infrastructureになりつつあるので、備忘録的に。
木村は主にOracle 7.xの時代に、今は無き(あるある)ジャストシステムにて、五郎というデータベースの開発にかかわっていました。主に五郎から他のデータベースに接続するドライバのうちOracleに接続するためのドライバをOCI7で作成し、Accessに接続するためにODBCドライバを作成していました。
1.OCI(Oracle Call Interface)とは何?
いわゆるネイティブ接続に利用するC言語ライブラリです。公式説明はこちら。
直接ワイヤプロトコルを話すドライバ以外は、基本このOCIを経由して、Oracleとやりとりします。
2.OCIの種類。OCIとOCI80
OCIはOracle 7まで利用されていたOCIと、Oracle 8以降に提供されたOCI80があり、現在では(おそらく)OCIといえばOCI80を指すと思います。
OCIは良くも悪くもC言語べったりのライブラリで、低レベルなAPIを提供していましたが、古いタイプのBLOB/CLOB(LONG/LONG RAW)の効率的な扱いも難しく、また新しいタイプのBLOB/CLOBには対応していませんでした。
そこでOracle 8からBLOB/CLOBに対応し、低レベルながらも、もう少しアプリケーションを組むのに優しい(ODBC的な)OCI80が登場しました。以降はこれが拡充され、OCIと呼ばれているはず、です。
(最初登場したときのディレクトリ名がOCI80だったので、それが慣用的に使われていたのかも)
比較的最近(Oracle 12c)の「Oracle Call Interface プログラマーガイド」では、Oracle 7まで利用されていたOCIを
OCIリリース7.3, Oracle 8からサポートされたものをOCIリリース8.0と呼んでいます。
3.7.4 使用されなくなったOCIルーチン
OCIリリース7.3のAPIは、小文字oからはじまるAPIで、
OCIリリース8.0のAPIは、大文字OCIからはじまるAPIになります。
例えばトランザクションのコミットは以下のような関数の呼び出しになります。
OCIリリース7.3: ocom()
OCIリリース8.0: OCITransCommit()
3.OCIとOCCI
木村は利用したことはないのですが、OCCI(Oracle C++ Call Interface)があります。OCCIは、Application Program Interface(API)の1つでOCCIを使用すると、C++言語で作成したアプリケーションからOracleデータベース内のデータにアクセスできます。
Oracle C++ Call Interfaceプログラマーズ・ガイド, 12cリリース2 (12.2)
「JDBCの知識がある場合は容易に習得できます」とのことなので、MySQLのConnector/C++的な立ち位置のようです。
JUGEMテーマ:コンピュータ