OCI上のWindows ServerからPerlを使ってOCI BaseDBへ接続する方法

皆さん、Perlは好きですか？
私は大好きで今でもデータの抽出や加工に使っていたりします。
Linuxだとデフォルトで入っていますし、Windowsでもビルドしてあるものが配布されていたりして導入も簡単です。

今回は、Windows上のPerlからOracleDBへアクセスする方法を紹介します。
DBのデータをPerlでいじれるとかなり便利だと思います。

## 環境（前提）
●データベース　→　OCI BaseDB（OraceDB 19c Standard Edition）
 PDBにテーブルを既に入れてある前提
●Windows　→　Windows Server 2022 Standard (OCI上に構築)
●OCI上のネットワーク
　VCNを構築済みでセキュリティリストでRDPで使うTCP/3389とOracleDBで使うTCP/1521が通る設定になっている事。

## WindowsへPerlを入れる
WindowsにPerlを入れるとなるとActive PerlかStrawberry Perlになるかと思いますが、今回は比較的新しめのリリースのあるStrawberry Perlをインストールします。

対象のインストーラをダウンロード
[こちら](https://strawberryperl.com/)へアクセスして最新版をダウンロードしてインストールします。

ダウンロードしたらインストーラを実行。
![30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/c5c87ad5-0765-2c85-c897-e689e74bcc38.jpeg)


![31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/6b5afdc3-94b7-71a0-967e-4c89da893a20.jpeg)


![32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/fbdd5341-f033-6a32-c40c-73166626921a.jpeg)
![33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/64be846d-f2ec-a565-b4af-316e9d4a6cda.jpeg)
![34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/4f54d70e-d424-f6a7-555c-85f2fecdca28.jpeg)

UACからこのようなメッセージが出たら「YES」を押下してください。
![35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/c62514d2-2cec-368a-2872-d51091178d61.jpeg)

![36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/0f6b616b-13b2-db57-877f-bab3cfe0bed9.jpeg)

![37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/963a1a5b-45da-6069-2d51-e23dcb413a37.jpeg)

無事にインストールが完了したらちゃんと実行できるか調べてみましょう。
コマンドプロンプトを開いて
perl -version
と入れてバージョンが表示されば無事にインストールされ、パスも設定されています。
![38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/95800dfd-dda6-f483-8a25-66c30ef14d3a.jpeg)

## Oracle Clientのインストール
次にOracleDatabaseへアクセスるために必要なOracle Clientをダウンロードします。
[こちら](https://www.oracle.com/jp/database/technologies/instant-client/downloads.html)にアクセスしてダウンロードします。
![39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/4504e662-e321-9589-cc2e-92af1309b333.jpeg)

パッケージがいくつかありますが、Basic, sqlplus, sdkの3つをダウンロードします。
![40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/3aabb965-13e1-a2e7-f955-53ede20aff37.jpeg)

![41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/3b8c63d1-ab28-5db9-8f23-642861b5e41b.jpeg)

C:¥直下に「oracle」という名前のフォルダを作成します。
![42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/27a91ba1-84aa-1806-fc9d-d82e2a4b5592.jpeg)

ダウンロードしたパッケージは3つとも中にinstantclient_21_9というフォルダが入っているので3つとも先ほど作成した「C:\oracle」へ入れます。
![43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/50f93478-4932-ca53-f226-0ea4fc4e1925.jpeg)

![44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/388902cf-28b6-1441-23f0-8752c39723a0.jpeg)

## 環境変数の設定
次に今コピーしたC:\oracle\instantclient_21_9へのパスを設定して、ORACLE_HOMEという環境変数も作成します。

まず、コントロールパネルを開きます。
![44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/ccee4338-bb07-49fe-116d-a1764da18075.jpeg)

カテゴリ順だとわかりずらいのでsmall iconsに切り替えます。
![45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/f51a6e4b-366a-25a6-1fe6-c34428abdab5.jpeg)

Systemを開きます。
![46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/1a324792-822f-484d-d219-4c726d69003e.jpeg)

右の方に「Advanced system settings」があるので開きます
![47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/37bac790-f9ec-9df2-c297-3bbef9c1b622.jpeg)

下の方に「Enviroment Variables」があるので開きます。
![48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/4b603dab-d990-e8ef-2c6b-62a63d781691.jpeg)

下の「System variables」のペインの中にある「Path」を選択し、「Edit」ボタンを押下します。
![49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/e9e0b257-43a2-6f2c-a811-45c8e2725c4f.jpeg)

右上の「New」ボタンを押し新しい値として「C:¥oracle￥instantclient_21_9」を入力し、下部の「OK」ボタンを押下します。
![50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/39868a42-1eb3-e542-5fa2-1642ea782656.jpeg)

これでパスの設定はできました。
次に新たな環境変数の追加です。
Enviroment Variablsウィンドウの下の方にある「New」というボタンを押下します。
![51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/a1c2d532-1e90-f446-cf6a-d9108a04aa27.jpeg)

新しい環境変数を作成するウィンドウが開くので「ORACLE_HOME」という変数に「C:¥oracle￥instantclient_21_9」を値として入力し、OKを押下します。
![52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/fc779dd0-ef68-0fe1-21b2-7e2309e100b5.jpeg)

パスが正しく通ったか動作確認をしてみます。
コマンドプロンプトを開いて
sqlplus
と入力し、下図のようにバージョンが出ればパスは通っています。
![53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367![57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/b1bdb211-f95e-71a8-0720-d398eb7144f4.jpeg)
692/5cfa49e8-39b0-a98c-725d-ea21d2d9a19c.jpeg)

## Perlのライブラリを入れる
PerlでOracleDatabaseへ接続するライブラリを追加します。
コマンドプロンプトで
cpan DBD::Oracle
と入力します。
![54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/9035b65f-ed6d-b0c8-8592-46eb3b0c045d.jpeg)

正常に終わると一番最後が「OK」になります。
![55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/1f7c75a6-e7b6-9bf1-56aa-3b31f4f072b8.jpeg)
ここでエラーになる場合はORACLE_HOMEという環境変数が正しく設定されていない可能性があります。

## OracleDBの設定
次にOracleDatabaseへアクセスする情報が入っているtnsname.oraファイルを作成します。
C:¥oracle￥instantclient_21_9￥network￥admin配下にtnsnames.oraを作成します。

次に、接続先のBaseDBへログインし、そちら側のtnsnames.oraを確認します。
![57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/1398dba3-cbcf-9452-6b78-c8f274009861.jpeg)

今回はPDBの方に接続するので赤枠のPDBの情報を先ほど作成したWindows側のtnsnames.oraにコピーします。
![56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/89bc5e55-7cce-7d55-2109-a8f8cd3dab8d.jpeg)

これでWindowsのコマンドプロンプトからsql plusを使ってBaseDBへアクセスできるはずです。
コマンドプロンプトで
sqlplus <DBのユーザー名>/<DBのパスワード>@<PDB名>
を入力して接続先情報が出ればOKです。
![59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/1f733a73-63e0-bf57-c2c0-969e5d21741a.jpeg)
試しにselect文を実行してみるとテーブルの中身が表示されます。

## PerlからSQL文を実行してみる
ここまで出来たらあとはPerlからアクセスするだけです。
こんな感じのスクリプトを準備しました。

```perl
#!perl.exe

use DBI;

print "----------------------------------------\n";
print "|CATNO\t|NAME\t|COLOR|\n";
print "----------------------------------------\n";
$dbh = DBI -> connect("dbi:Oracle:PDB1","test","<パスワード>");
$sth = $dbh -> prepare('SELECT * from cat');
$sth -> execute();
while(@ary = $sth -> fetchrow){
	$i = 0;
	while($i < @ary){
		print "|" . $ary[$i] . "\t";
		$i++;
	}
	print "|\n";
}
$sth -> finish();
$dbh -> disconnect();

```

これを実行すると以下のような結果になしました。
![61.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/da6431c3-c7a0-c115-542a-a1d121d7ef9a.jpeg)

PerlからSQL文を叩けるようになれば色々とデータをいじれて便利になりますね。

以上、OCIのWindowsServerからPerlでBaseDBへ接続する方法でした。