■■■Oracle Cloudのウェビナーシリーズは→こちら■■■
はじめに
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 で接続してみましたが、それのRでやってみた版です。
環境
- Ubuntu (WSL上の)
- R version 3.5.2
※Rのインストールは、以下を参考にしました。
WSLのUbuntu 18.04にRをインストールする
※WSL=Windows Subsystem for Linux
インストール
公式ドキュメントの英語版・日本語版
- Using Oracle Autonomous Data Warehouse - Connect with Python, Node.js, and other Scripting Languages
- Oracle Autonomous Data Warehouseの使用 - Python、Node.js、およびその他のスクリプト言語での接続
に従って実施。以下やったこと。
Instant Client のインストール
今回は /u01/app/oracle 以下にインストールすることにする。
OTNダウンロードサイト:Oracle Instant Client より、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
2つをダウンロード。
/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
シンボリックリンクの状況は、前回 と同じだったので割愛。
libaioのインストール
前回 と同じ環境なので今回は実施していない。
ROracleのインストール
ADWのドキュメント該当箇所からは、
ROracle: To install ROracle for R, use the instructions on the following page: ROracle
で、INSTALL用のREADME的な資料に飛ぶので、それを参考にして実施。
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の2つを設定すれば、インストールは R CMD INSTALL ROracle_1.3-1.tar.gz だけでOKのはず。なのだが、色々とエラーで進めなかったので、今回は上記のように --configure-args 内で--with-oci-inc= と--with-oci-lib= の2つを指定して実行した。
補足
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 ) ので、通常はそのどれかを指定すればよい
準備・接続に必要なセキュリティ資格証明を設定
前回 と全く同じなので割愛。
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の利用)