Oracle Databaseへの言語別アクセスドライバのまとめ

本記事は[JPOUG Advent Calendar 2020](https://adventar.org/calendars/5265)の12/10の記事となります。12/9は@ora_gonsuke777さんの[Application Continuity を Java の UCP(ucp.jar) と Autonomous Database の ATP で試してみる。(Oracle Cloud Infrastructure)](https://qiita.com/ora_gonsuke777/items/5e348a4f444b2d3643d0)でした。

Oracle Databaseは、個人の方が作成したものも含めると、世の中の主要な言語からSQLアクセスが可能になっています。本記事では、Oracle社から提供されているアクセスドライバを対象に、どのような言語からどのようなドライバを用いてSQLアクセスするのか、をまとめてみました。基本、有償との言及がないものは、追加費用不要です(より正確には、Oracle Databaseのライセンスに含まれています)。


# C/C++
### Oracle Call Interface (OCI)
昨今OCIというとOracle Cloud Infrastructureのことだったりしますが、"OCI"の元祖はこちら、Oracle Call Interface(以下OCI)となります。OCIは、C言語から利用するための、最も低層のAPIとなります。Oracle ClientをインストールするとOCI関連のライブラリもインストールされます。OCIはC言語用のAPIとなり、C++向けはOCCI(Oracle C++ Call Interface)となります。
DBアクセスとしては最も高速なアクセスが可能な手段でもあり、最も多機能な手段でもあるのですが、低層のAPIということもあり、利用難易度も高く、相当な高速性を求める場合や、アクセスドライバを作るための手段としての利用が大半です。

### Pro*C
Oracle Precompilersという製品群の中のひとつとなります。
データベースのラインセンスとは別にライセンスを購入する必要があります。
製品群の名称のとおり、プリコンパイラとなります。
コーディング自体は、Embedded SQL(埋め込みSQL)の構文に沿って記述します。

### ODPI-C
ODPI-Cは「Oracle Database Programming Interface for C」の略で、OCIをwrapしてより使いやすくしたアクセスドライバとなります。C/C++に対応しています。
一部のOracle提供アクセスドライバや、他のOSSベースのアクセスドライバの一部はODPI-Cを使用して作成されています。
ODPI-CはGitHubにてソースが公開されているOSSです。ライセンスはUPL/Apache Licenseです。ソースはオリジナルのアクセスドライバを作成する際に参考になると思います。
ODPI-CもOracle Clientに付属しています。今はOracle Instant Clientごと落して利用する形が多いと思われます。GitHubからDockerファイルをダウンロードすることもできます。
[ODPI-C製品サイト](https://oracle.github.io/odpi/)


# Java
### JDBCドライバ(OCIドライバ / Thinドライバ)
JavaからOracle Databaseにアクセスする場合、Oracle JDBC Driverを使用します。Oracle JDBC DriverにはOCIドライバとThinドライバの2種類が存在します。OCIドライバはThinドライバとの対比でThickドライバと呼称される場合もあります。
これらの根本的な違いは、OCIドライバはOracle Clientを必要とし、Thinドライバは必要としない点です。つまり、ThinドライバはOracle Clientの中の通信部分(Oracle Net Services)の部分まで含めてJavaで記述されています。機能的にはOCIドライバでないとできないことが若干存在しますが、Thinドライバの方がよく利用されている印象です。
ドライバは[ダウンロードサイト](https://www.oracle.com/jp/database/technologies/appdev/jdbc-downloads.html)からダウンロードすることも可能ですが、[Central Maven Repository](https://repo1.maven.org/maven2/com/oracle/database/)から入手することことも可能です。


# .NET
### ODP.NET(マネージドドライバ / アンマネージドドライバ / ODP.NET Core)
ODP.NET(Oracle Data Provider for .NET)は、Oracle社が提供する.NETデータ・プロバイダです。基本ADO.NETと同じAPIでの利用が可能で、かつOracle Database独自機能の利用が可能になっています。
ODP.NETには、アンマネージドドライバ（管理対象外ドライバ）と、マネージドドライバ(管理対象ドライバ)の2種類が存在します。これらは、JDBCのOCIドライバとThinドライバのような関係で、前者はOracle Clientが必要で、後者は不必要です。機能面は前者がより豊富となりますが、Nugetからインストールできる気軽さもあり、後者の利用が主流と思われます。
また、ODP.NETには、.NET Core対応のODP.NET Coreも存在します。こちらはマネージドドライバのみ(対応APIに更なる制限あり)となります。Nugetからのインストールも可能です。


# JavaScript(Node.js)
### node-oracledb
Node.jsのアプリケーションからOracle Databaseにアクセスするためののドライバです。
Apache LicenseのOSSです。npmでのインストールが可能です。
[node-oracledb製品サイト](https://oracle.github.io/node-oracledb/)


# Python
### cx_Oracle
PythonのアプリケーションからOracle Databaseにアクセスするためののドライバです。
BSD LicenseのOSSです。pipやcondaを通じたインストールが可能です。
余談ですが、筆者がQiitaで利用方法をまとめています。
[cx_Oracle製品サイト](https://oracle.github.io/python-cx_Oracle/)
[cx_Oracle入門](https://qiita.com/nakaie/items/df170c3fa6895cf1b44d)
なお、現在は新機能を追加したpython-oracledbというドライバに席を譲っており、本ドライバの新規利用は推奨されていません。

### python-oracledb
PythonのアプリケーションからOracle Databaseにアクセスするためののドライバです。
python-oracledbはcx_Oracleの後継のアクセスドライバとなっています。
基本的な使い勝手はcx_Oracleとおおよそ同様ですが、python-oracledbは同一ドライバでThinモード(Oracle Client不要)とThickモード(Oracle Client必要)の両方に対応しました。
ライセンスはUPLおよびApacheライセンスのデュアルライセンスに変更されています。
pipやcondaを通じたインストールが可能です。
python-oracledbについても筆者がQiitaで利用方法をまとめています(より正確には書き足し中)。
[python-oracledb製品サイト](https://oracle.github.io/python-oracledb/)
[python-oracledb入門](https://qiita.com/nakaie/items/c373cff694cb23a8568c)



# PHP
### pdo_oci
PDO(PHP Data Object)という接続先DBMSを抽象化した、汎用的なAPIでアクセスするためのオブジェクトとなります。PHPに標準添付されていますが、PECL経由での入手も可能です。

### php-oci8
PDOと違って独自APIとなります。PDOと同じくPECL経由での入手が可能です。


# COBOL, FORTRAN
### Pro*COBOL, Pro*FORTRAN
前述のPro*CのそれぞれCOBOL版、FORTRAN版となります。Pro*Cと同じく、これらも有償です。


# 汎用ドライバ
### ODBCドライバ
Oracle Database用のODBC(Open Database Connectivity)ドライバが提供されています。Oracle Clientにも含まれていますが、Oracle Instant Clientを通じた利用が多いと思われます。LinuxなどWindows以外のプラットフォームでも利用可能です。

### Provider for OLE DB
Oracle社が提供するOLE DBプロバイダです。Windows版のOracle Clientに同梱されています。

# 最後に
未対応の言語のアクセスドライバが出た場合は追記していきたいと思います。