Node.jsからOracleへ接続してSQLを実行する方法

虎の穴ラボのH.Hです。
以前作ったNode.jsで動くPuppeteerでWebサイトのテストをしていた際に、画面の動作と合わせてデータベースへの登録が正しく行われているかを確認する必要が出てきたため接続方法を調べたのでこちらにまとめました。

Puppeteerの利用方法はこちらをご覧ください。
WEBサイトへのアクセスと文言のチェックなどを行う仕組みが書かれています。
<a href="https://toranoana-lab.hatenablog.com/entry/2020/07/03/170429">Puppeteerを使ってWebサイトの自動テストツールを作ってみた</a>

# 条件
環境:MacBookPro 
対象DB:Oracle
Node.js:バージョンv15.8.0

# 手順
## 1.Node.jsが動作するディレクトリを作成
動かすユーザーのホームディレクトリに以下のようにディレクトリを作成
puppeteerで使用するのでディレクトリを「puppeteer」としていますが、名前は任意なので用途にあった名前で問題ありません。

```sh

$ mkdir ~/workspace/auto_test/puppeteer
```

## 2.Node.jsのインストール
```sh

$ cd ~/workspace/auto_test/puppeteer
$ nodebrew install-binary latest
$ npm init
$ npm install --save puppeteer
```
(2021/2/4時点で最新バージョンはv15.8.0)

## 3.Oracle Instant Clientのインストール
公開されている手順は<a href="https://oracle.github.io/node-oracledb/INSTALL.html#instosx">こちら</a>に記載されています。
今回はManual Installationとして記載されている手順を実行します。
### 3.1.ダウンロードするClientを選択する
下記のサイトからOSに合うものをダウンロードします。
<a href="https://www.oracle.com/jp/topics/technologies/download-instant-client.html">Instant Clientのダウンロード</a>
今回はMacOSのものを選択します。ダウンロードは「Instant Client for Mac OS X (Intel x86) (32-bit and 64-bit)」のリンクの先の「Instant Client Package - Basic」で問題ありません。
(ダウンロードにはOracleプロファイルのアカウントが必要です)
### 3.2.dmgファイルをダウンロードする
上記のサイトからOracle Instant Clientのdmgファイルをダウンロードする

### 3.3.ダウンロードしたファイルをダブルクリックで開く
2021/2/8現在macOS向けは19.8が最新になります。
（OS毎にバージョンがバラバラなので注意が必要です）

### 3.4.インストール用のコマンドを実行する
下記のコマンドを実行する

```sh

$ /Volumes/instantclient-basic-macos.x64-19.8.0.0.0dbru/install_ic.sh
```

### 3.5.instantclientへのパスを通す
以下のコマンドで先ほど作成したディレクトリへのパスを通します。
以下のコマンドを実行してbash_profileに以下の内容を追記します。
（Macで動作を確かめる前にLinuxでも環境が構築できるかを確かめていたので、その際の設定と同じにするためにbash_profileに設定を記述しています）

```sh

$ vi ~/.bash_profile 
```

```
export PATH=(ユーザーのホームディレクトリ)/Downloads/instantclient_19_8:$PATH
export LD_LIBRARY_PATH=(ユーザーのホームディレクトリ)/Downloads/instantclient_19_8:$LD_LIBRARY_PATH
```

## 4.oracledbのインストール
node.jsからoracleへ接続するためのモジュールをインストールします。
場所は(ユーザーのホームディレクトリ)/workspace/auto_test/puppeteerです。
コマンドは以下の通りです。

```sh

$ npm install oracledb
```

## 5.接続用の設定ファイルを準備する
(ユーザーのホームディレクトリ)/workspace/auto_test/puppeteer配下に設定用のファイルを作成します。
名前は任意で実行時のコードでパスを指定するので、場合によっては配下にディレクトリを作成しても問題ありません。
今回は配下にsettingというディレクトリを作成して、その中にdbconfig.jsという名前で作成します。

```js
module.exports = {
  user          : "ユーザー名",
  password      : "パスワード",
  connectString : "アドレス:ポート番号/スキーマ名",
  externalAuth  : process.env.NODE_ORACLEDB_EXTERNALAUTH ? true : false
 };
```

## 6.Node.jsの実行ファイル
ここからNode.js上で実行され実際にSQLを実行する部分になります。
今回はSELECT文の実行を行う内容になります。
SQL文をsqlという変数で定義し、動的なパラメータはparameterで定義しています。

```sql
--例
SELECT * FROM table1 WHERE record_no=:record_no
```
:record_noの部分に動的に値をいれることができます。
parameterは配列です。
実行ファイルの名称は任意で設定可能です。ここではaction.jsとします。

```js
const oracledb=require('oracledb');
(async () => {
const dbConfig = require('./setting/dbconfig.js');
try {
    sql='SELECT * FROM table1 where record_no=:record_no';
    parameter=[1];
    connection = await oracledb.getConnection(dbConfig);
    options = {outFormat: oracledb.OUT_FORMAT_OBJECT};
    result = await connection.execute(sql,parameter, options);   
    //複数行も取れるので、ここからは取得したデータの加工などを行う
}catch(error){
    console.log("ERROR"+error);
}finally{
    await connection.close();
}
})();
```

## 7.実行
実行は以下のコマンドで可能です。

```sh

$ node action.js
```

## 8.まとめ
Node.jsからOracleに接続する手順について今回まとめました。注意点はoracledbを動かすためのOracle Instant ClientがOS毎に異なる点です。[3の部分](#3oracle-instant-clientのインストール) で各OS用のファイルをダウンロードして、公式のGitHubのページの手順を行えばインストールすることが可能です。
（Linux環境の場合はzipファイルをダウンロードし、解凍してパスを通すことで完了しました）
Node.jsからOracleに接続する手順を日本語でまとめたページがあまりなかったので、参考にしていただければ嬉しいです。