OracleDatabaseClient19cのサイレントインストールbat＆コマンドまとめ

## この記事について
OracleDatabaseClient19cをサイレントインストールを用いて配布する方法のまとめです。
OracleDatabaseはサーバー上にあり、中身が同じクライアント環境を複数箇所で作成することを想定しています。
普通にやると詰まる箇所があったので、その回避方法も紹介しています。

## ①Oracleのファイルを配布先へコピー
Oracle公式などから取得したOracleClientのファイルを配布元サーバーに配置し、配布先へコピーします。
USBなどに入れて直接コピーしてもいいですが、以下のように配布用batファイルを作成すると手間が省けます。
```bat:FileCopy.bat
@echo off
xcopy "配布元フォルダディレクトリ" "配布先フォルダディレクトリ" /S /C /E /Q /H /R /Y

rem 配布元ディレクトリでは、以下の配布ファイルイメージが格納されているフォルダを指定すればおｋです。
rem 例："\\servername\c$\Database_Client"

rem 配布先ディレクトリでは、存在していないフォルダを指定すると自動生成してくれるxcopyの性質を利用してフォルダ作成とコピーを同時に行います。
rem 例:"C:\Oracle\product\19.3.0\client_1\"
```

※配布ファイルイメージ（59項目くらい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1956427/fc0b8ccc-f319-15ed-51b5-97dfcf93ffba.png)

## ②レジストリに値を格納
19cからの変更点なのかは不明ですが、このままサイレントインストールを実行すると、、
```cmd.exe
[FATAL] java.lang.NullPointerException
```
が出てしまい、インストールが失敗します。
このエラーの解決の為にはレジストリエディターなどから事前に特定の値を設定しておく必要があります。
手動で追加する場合とBatファイルを配布して自動で行い場合の2パターンを紹介します。

### Batファイルでレジストリを追加する場合
以下のBatファイルでレジストリの値をチェックし、レジストリに指定の値が存在していない場合に追加、既に存在している場合は何も実行せず終了出来ます。
```bat:AddRegedit.bat
@echo off
echo レジストリの設定を開始します。
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" > nul 2>&1
if ERRORLEVEL 1 ( REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" ) 
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" /v "inst_loc" > nul 2>&1 
if ERRORLEVEL 1 ( REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" /V "inst_loc" /d "C:\Program Files\Oracle\Inventory" 
echo レジストリの設定が完了しました。何かキーを押すとプログラムが終了します。 
pause > nul) else ( echo 既にレジストリが設定されているため、Batファイルの起動は不要です。何かキーを押すとプログラムが終了します。 
pause > nul
exit /b 
)

rem 32bit版の場合は(86)を追加して"C:\Program Files (x86)\Oracle\Inventory"としてください。
```

### 手動でレジストリを追加する場合
**①Windowsキーを押しながらRを押下**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1956427/355a20f5-0b02-461b-7887-99997222f6b8.png)

**②regeditと入力し、OKを押下**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1956427/e259cf89-cdf0-bf1d-40fa-4a94eef989f5.png)

**③指定の位置にORACLEキーを追加**
場所：HKEY_LOCAL_MASHINE\SOFTWARE\WOW6432Node
WOW6432Nodeを右クリック→新規→キー→Oracleと入力→Enter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1956427/d8340b47-34f1-5e2f-ef46-4fdb29e3423c.png)

**④追加したORACLEキーにInventoryの値を格納**
ORACLEを右クリック→新規→文字列値→inst_locと入力→Enter→Inst_locを右クリック→修正→C:\Program Files\Oracle\Inventoryと入力（32bit版の場合はC:\Program Files (x86)\Oracle\Inventory）→Enter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1956427/ea07f9a2-4f72-3f6d-528c-831b633e8ab4.png)

## ③レスポンスファイルの作成
サイレントインストールで必要になる、Oracle_BASEやOracle_HOMEなどの設定情報を格納したレスポンスファイルの作成をします。
レスポンスファイルはsetup.exeをGUIで起動して基本情報を入力して進めた後、以下の画面で「レスポンス・ファイルの保存」を選択することによって簡単に作成出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1956427/c01485cf-4096-eaef-d4d1-89baf78ca21d.png)


しかし、19cではなぜかレスポンスファイルの情報が抜け落ちている場合があるので、メモ帳などで開いて値を追加する必要があります。
**以下の例では、ORACLE_BASEしか情報がないので、その下にORACLE_HOME=C:\Oracle\product\19.3.0\client_1を追加して上書き保存**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1956427/5d502acc-9784-7cc6-db24-6c52bf49a593.png)


## ④サイレントインストール用Batファイルの作成
以下のようにBatファイルを作成するとサイレントインストールが実行出来ます。
```bat.OracleInst.bat
@echo off
"C:\Oracle\product\19.3.0\client_1\setup.exe" -silent -responseFile "C:\Users\hoge\Desktop\client.rsp"
pause

rem pause入れないと実行後にエラーが出ていても画面が閉じてしまうので一応入れています。
```
-silent -responseFileの指定は必須で、次に紹介するコマンドを追加して様々な動きを加える事も可能です。（-debugはエラーが出たときに原因を追えるので便利）

## サイレントインストール時に指定出来るコマンド一覧

### ヘルプを表示する
```
-help 
```
### サイレントモードで実行する
```
-silent 
```
### レスポンスファイルの指定
```
-responseFile -レスポンスファイルの完全パス(C:\Users\hoge\Desktop\client.rspとか)
```
### 表示するメッセージログの指定（指定した優先度レベルまでのメッセージログを有効に出来る）
```
-logLevel -優先度の指定
 
【指定出来る優先度】
severe,warning,info,config,fine,finer,finest
```
### インストールされたホームに構成ツールを実行
```
-executePrereqs
```
### デバッグモードで実行
```
-debug
```
### ディスクの使用状況に関するデバッグ情報をログに記録
```
-printdiskusage
```
### メモリー使用量に関するデバッグ情報をログに記録
```
-printmemory
```
### 時間の使用状況に関するデバッグ情報をログに記録
```
-printtime
```
### 完了するまでプロンプトが返ってこないようにする
```
-waitForCompletion
```
### 構成ツールを実行しない
```
-noconfig
```
### メッセージをコンソールに表示しない
```
-noconsole
```
### 内部ドライバエラーを無視して実行
```
ignoreInternalDriverError
```
### Oracleホームにリリース更新を適用
```
-applyRU
```
### 個別パッチをOracleホームに適用
```
-applyOneOffs -個別パッチを指定（カンマ区切りで複数指定可能）
```

## ⑤まとめ
これまでのBatは一つのファイルに合体させて使うと便利です。
実際使う際にはsqlnet.oraとtnsnames.oraも必要になると思うので、それらのコピーも兼ねて作ると以下のようになります。
```bat:OracleClientSilent.bat
@echo off

rem Oracleファイルのコピー
xcopy "配布元フォルダディレクトリ" "配布先フォルダディレクトリ" /S /C /E /Q /H /R /Y

rem ディレクトリの設定
echo レジストリの設定を開始します。
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" > nul 2>&1
if ERRORLEVEL 1 ( REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" ) 
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" /v "inst_loc" > nul 2>&1 
if ERRORLEVEL 1 ( REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" /V "inst_loc" /d "C:\Program Files\Oracle\Inventory" 
echo レジストリの設定が完了しました。 
) else ( echo 既にレジストリが設定されています。)

rem OracleClientのサイレントインストール
"C:\Oracle\product\19.3.0\client_1\setup.exe" -silent -responseFile "C:\Users\hoge\Desktop\client.rsp"
pause
rem エラーが出た場合に確認する必要がなく、一切操作したくない場合はpauseを消してもいい

rem sqlnet.oraとtnsnames.oraのコピー
xcopy "コピー元\sqlnet.ora" "C:\Oracle\product\19.3.0\client_1\network\admin\" /C /Q /H /R /Y
xcopy "コピー元\tnsnames.ora" "C:\Oracle\product\19.3.0\client_1\network\admin\" /C /Q /H /R /Y

```