Oracle CloudにあるAutonomous Data WarehouseにRから接続してみる（ROracleの利用）

**■■■Oracle Cloudのウェビナーシリーズは→[こちら](https://bit.ly/2VJS8pU)■■■**

# はじめに

ROracleは、RからOracle Databaseに接続する際に利用します。
Rプログラムを実行するクライアント側にインストールして利用します。

Oracle Autonomous Data Warehouse（ADW）はOracle Cloud Infrastructure（OCI）環境にあるAutonomousで超高速なデータベースですが、これもOracle Databaseなので、ROracleで接続できます。

具体的には、

- Oracle Client (Instant Client でも Full Clientでも良いが、今回は前者を利用。Instant Clientの場合、ROracleを動かすにはSDKのインストールも必要。）
- ROracle

をインストールします。

※以前、[Python -- cx_Oracle -- Oracle Instant Client -- ADW](https://qiita.com/mikika/items/17e6949b21fcc447ee98) で接続してみましたが、それのRでやってみた版です。

# 環境

- Ubuntu (WSL上の）
- R version 3.5.2

※Rのインストールは、以下を参考にしました。
[WSLのUbuntu 18.04にRをインストールする](https://qiita.com/yutannihilation/items/78708fa9f3a9c22e56b3)

※WSL=Windows Subsystem for Linux

# インストール

公式ドキュメントの英語版・日本語版

- [Using Oracle Autonomous Data Warehouse - Connect with Python, Node.js, and other Scripting Languages](https://docs.oracle.com/en/cloud/paas/autonomous-data-warehouse-cloud/user/connecting-nodejs.html#GUID-AB1E323A-65B9-47C4-840B-EC3453F3AD53)
- [Oracle Autonomous Data Warehouseの使用 - Python、Node.js、およびその他のスクリプト言語での接続](
https://docs.oracle.com/cd/E83857_01/paas/autonomous-data-warehouse-cloud/user/connecting-nodejs.html#GUID-AB1E323A-65B9-47C4-840B-EC3453F3AD53)

に従って実施。以下やったこと。

## Instant Client のインストール

今回は /u01/app/oracle 以下にインストールすることにする。

[OTNダウンロードサイト：Oracle Instant Client](
https://www.oracle.com/technetwork/database/database-technologies/instant-client/overview/index.html)　より、Version 18.3.0.0.0 の、

- Base - Basic Package の、
 instantclient-basic-linux.x64-18.3.0.0.0dbru.zip
- Development and Runtime - SDK Package の、 instantclient-sdk-linux.x64-18.3.0.0.0dbru.zip 

２つをダウンロード。

/u01/app/oracle 直下にダウンロードしたファイルを配置し、unzip。

```
$ mkdir -p /u01/app/oracle
$ cd /u01/app/oracle 
$ unzip instantclient-basic-linux.x64-18.3.0.0.0dbru.zip
$ unzip instantclient-sdk-linux.x64-18.3.0.0.0dbru.zip
```

シンボリックリンクの状況は、[前回](https://qiita.com/mikika/items/17e6949b21fcc447ee98#instant-client-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) と同じだったので割愛。

### libaioのインストール

[前回](https://qiita.com/mikika/items/17e6949b21fcc447ee98#instant-client-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) と同じ環境なので今回は実施していない。

## ROracleのインストール

ADWのドキュメント該当箇所からは、

> ROracle: To install ROracle for R, use the instructions on the following page: ROracle

で、[INSTALL用のREADME的な資料](http://cran.cnr.berkeley.edu/web/packages/ROracle/INSTALL)に飛ぶので、それを参考にして実施。

Oracle Instant Clientの場合は、SDKが必要なことは冒頭に記載あり。

>  If using an Oracle Instant Client, you need
  either the Basic or Basic Lite packages in addition to the SDK package.


### ROracleをダウンロード


上のREADMEのひとつ上のディレクトリ：
http://cran.cnr.berkeley.edu/web/packages/ROracle/
から、ROracle_1.3-1.tar.gz をダウンロードした。


### 環境変数 LD_LIBRARY_PATH と OCI_LIB を設定

```
$ export LD_LIBRARY_PATH=/u01/app/oracle/instantclient_18_3:$LD_LIBRARY_PATH
$ export OCI_LIB=/u01/app/oracle/instantclient_18_3
```

### ROracleをインストール

```
$ R CMD INSTALL --configure-args='--with-oci-inc=/u01/app/oracle/instantclient_18_3/sdk/include --with-oci-lib= /u01/app/oracle/instantclient_18_3' ROracle_1.3-1.tar.gz
```

公式ドキュメント（README的なやつ）では、環境変数LD_LIBRARY_PATH と OCI_LIBの２つを設定すれば、インストールは **R CMD INSTALL ROracle_1.3-1.tar.gz** だけでOKのはず。なのだが、色々とエラーで進めなかったので、今回は上記のように --configure-args 内で--with-oci-inc= と--with-oci-lib= の２つを指定して実行した。

### 補足

**R CMD INSTALL ROracle_1.3-1.tar.gz** 実行で失敗していた際のエラーメッセージ。丁寧な確認ができなかったので手順ミスの可能性はあるが、備忘録として。


**R CMD INSTALL 時のエラー：その①**

```
configure: error: OCI libraries not found
ERROR: configuration failed for package ‘ROracle’
```

**R CMD INSTALL 時のエラー：その②**

```
Error: package or namespace load failed for ‘ROracle’ in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object '/usr/local/lib/R/site-library/ROracle/libs/ROracle.so':
  libclntsh.so.18.1: cannot open shared object file: No such file or directory
```  

# ADW環境への接続

## ROracle 詳しい方へ：ざっくり説明

ADWに特化した情報としては、

- 接続に必要なクライアント資格証明ファイル一式（Wallet_XXX.zip）が必要で、Oracle Clientの network/admin 配下に置き展開
- *.zip内に tnsnames.ora も含むので、R からは dsn= で、tnsnames.ora のエントリ（ネット・サービス名）を指定
- ※ ADWではインスタンス作成時に3つの事前定義されたネット・サービス名が作られる( XXX_high, _medium, _low ) ので、通常はそのどれかを指定すればよい

## 準備・接続に必要なセキュリティ資格証明を設定

[前回](https://qiita.com/mikika/items/17e6949b21fcc447ee98#%E6%BA%96%E5%82%99) と全く同じなので割愛。

Oracle Instant Client のインストール箇所が前回と異なるため、network/admin の場所は適宜読み替えて実行。

- 前回：$HOME/instantclient_18_3/network/admin/
- 今回：/u01/app/oracle/instantclient_18_3/network/admin/


## ADWに接続しSQLを実行

dbConnect()に、接続情報を指定する。
dbname=にtnsnames.oraのエントリを指定。

```
$ export LD_LIBRARY_PATH=/u01/app/oracle/instantclient_18_3:$LD_LIBRARY_PATH
$ export OCI_LIB=/u01/app/oracle/instantclient_18_3

$ R

R version 3.5.2 (2018-12-20) -- "Eggshell Igloo"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library(ROracle)
Loading required package: DBI
> drv <- dbDriver("Oracle")
> con <- dbConnect(drv, username = "scott", password="tiger", dbname="myadw_high")
> res <- dbSendQuery(con, "select * from sh.costs")
> fetch(res,n=10)
   PROD_ID    TIME_ID PROMO_ID CHANNEL_ID UNIT_COST UNIT_PRICE
1      118 2000-12-31      999          4         7          7
2      120 2000-07-06      999          2         8          8
3      120 2000-07-23      999          2         8          8
4      120 2000-08-01      999          2         8          8
5      120 2000-08-09      999          2         8          8
6      120 2000-08-14      999          2         8          8
7      120 2000-08-31      999          2         8          8
8      120 2000-10-04      999          2         8          8
9      120 2000-11-02      999          2         8          8
10     120 2000-11-03      999          2         8          8
>
> quit()
$
```

# 参考

前回前回言ってるのはこちら：
[Oracle CloudにあるAutonomous Data WarehouseにPythonから接続してみる（cx_Oracleの利用）](https://qiita.com/mikika/items/17e6949b21fcc447ee98)