Windows10からOracle接続
Windows10(64Bit)環境からのOracleDBへの接続の手順の備忘
Oracleクライアントのインストールだけでも、めっちゃハマる・・・【POINT】がハマりポイントを示す。
色々な概念の理解が必要。
Oracleはご存知の通りデータベース。
【オラクルデータベース(サーバー)】 ― 通信 ―
― 【オラクル クライアント】 ― SQL問合せ ―
― 【アプリ(AccessとかPHPとか)】
簡単に描くと上記のようなDB本体があるサーバーに対して、クライアントが、問合せ(通信)をしている。
多くの会社では、この本体のサーバーはシステム部門が管理していて、そこに通信をするための情報が開示されており、その情報を使ってクライアントからDBサーバーへ接続する。さらに、Accessとか、PHPなどのプログラムやアプリは、このオラクルクライアントを使って、DB問合せ言語SQLで、問合せをする。
このクライアントには、2つある。
①Oracle Client
②Oracle Instant Client
上記の2は大きく違う。①はインストールするが、②は圧縮ファイルをダウンロードして解凍してそのまま使う。
①の方が、自動でいろいろ設定してくれるようだが・・・問題点がある。
・【POINT】ダウンロード先が分かりづらい
https://www.oracle.com/jp/database/technologies/oracle-database-software-downloads.html
このページはDB本体。自分のパソコン環境のところでノートの「See All」からリンクした先ページにクライアントが置いてある。
・過去のバージョンは簡単にダウンロードできない。
上記ページの一番したに注意書きがあるが、OracleDBのライセンスを持っている人がサポートページから手順を踏むと入手できるらしい。
・【POINT】インストールが進まない。
検索すると出てくるが、Windows10とかでインストールが「マウスがぐるぐる」の状態で進まない。一見、考え中のようだが、どんだけ待ってもインストールは進まないので注意が必要。
・【POINT】インストールファイルには、xxx_home.zipとxxx.zipの2つがある。
この2つの違いは良くわからない・・・
・【POINT】そのまま解凍するとエラーがでる。
ダウンロードできる圧縮ファイル名が長いので、デフォルトでそのまま解凍する解凍フォルダ名が長すぎて、解凍の途中でエラーになる。適当に「ora」とか短いファイル名にする必要がある。
以上のように、色々調べたが、①のインストールは相当難しい・・・私は諦めた。
なぜなら・・・①と②の違いとしては、①では、いろいろな開発ツールも入ってくる。純粋にOracleデータベースにクライアントから接続すれば良いのであれば、②のinstant clientで十分なようだ。
②のダウンロードは以下。
https://www.oracle.com/jp/database/technologies/instant-client/downloads.html
こちらは、過去のバージョンも使える。使うアプリケーションとかにより、安定稼働するバージョンも選べる。
【POINT】
32bit版なのか64bit版なのかだが・・・クライアントをインストールする端末なのか、相手のサーバーなのか良くわからない。
クライアント側が64Bit Windows10だが、32Bit版を今回入れた。どうやら、サーバー側が32Bitなのか?システム担当者が先に入れた別の端末が32版だったので、その事例に習った。64Bitで良いきがするが・・・
▼以下②Oracle Instant Client の設定
https://www.oracle.com/jp/database/technologies/instant-client/downloads.html
ここから環境を選択して、必要なバージョンのOracle Instant Clientをダウンロードして、適当なフォルダに解凍。
【POINT】さらに、同じバージョンのInstant Client ODBCパッケージをダウンロードして、それを、上記のoracle instant clientのフォルダの中に入れる。その上で、odbc_install.exeを実行。ウィンドが出るが、「互換・・・」の方を選んで無理やりインストール。
https://www.oracle.com/jp/database/technologies/releasenote-odbc-ic.html
このインストールの説明は上記。
【環境変数の設定】
環境変数の設定方法はググって。
システム環境変数側の新規追加で
NLS_LANG = Japanese_Japan.JA16EUCTILDE
OCI_LIB64 = 【oracle instant clientの場所 例:c:\instantclient12_2 とか】
ORACLE_HOME = 【適当にフォルダを作り、その場所を指定する。】
TNS_ADMIN = 【TNSNAMES.ORAのファイルを置いたフォルダ】
【POINT】
ORACLEサーバーへの接続は
①IPアドレスとポートを指定して接続
②TNS_NAMEというのを定義。それが、TNS_NAMES.ORAというファイルに記載する。その名前を使って接続。
の2つの方法がある。②の場合は、環境変数のTNS_ADMINの設定が必須
https://docs.oracle.com/cd/E57425_01/121/MXCLI/post_inst_task.htm
https://docs.oracle.com/cd/E57425_01/121/SQPUG/GUID-5A2953BF-9E2F-450B-AFBA-EE2846C59B5E.htm
ここにその説明がある。
▼ODBC Data Source でWindowsアプリ用のドライバーを登録する。
Windows 10のスタートメニューの検索で「odbc」と入れると表示される、ODBC Data Sourceを起動。
32Bitと64Bitがある。インストールした方を選ぶ。
「システムDSN」を選んで、「追加」のボタン。
ODBCパッケージのインストールがうまくいっていれば、この中に「Oracle Instant Client XX」※XXはバージョンが、表示されるのでそれを選択する。そしたら、接続設定になるので、TNS_NAMEとかログインIDとか入れたら、TestConnectionして、パスワード入れる。
Successとなったら、見事にサーバー接続完了!
これで、このODBC接続を使って、ACCESSで、OracleDBへの接続はできるはず。
Windwos環境でのPHPからのOracle接続にはさらにひと手間。
【POINT】
WINDOWSアプリ(ACCESS)からOracle Instant Clientを利用する場合は、上記のフォルダのDLL(ダイナミックリンクライブラリー)が使われる。一方で、PHPの場合は違うようだ。
環境変数のパスの設定で優先されて、順番(Path設定の上にある。その上で、設定されたPathのサブフォルダという順?)で、DLLを探すみたいだ。問題は・・・
このDLLと、PHPが、32BITなのか、64BITなのかで一致している必要がある。
PHPの32OR64に調べ方は
<?php echo PHP_INT_SIZE; ?>
のPHPスクリプトで分かる。これが4なら、32Bit、8なら64Bitとなる。
64BitのPHPなら、Oracle Instant Clientも64の方を使う。上記の例では、Windows10環境には、32Bit版のOracleInstantClientを入れた。
下記、前の記事のPHPでのOracle PDO接続の方法は正しいが、今回のWindowsに入れたOracleInstantClientを使うとハマる。
PHPでUnable to load dynamic library 'oci8_12c' ApacheのErrorログに出ていれば、PHPとDLLのバージョンの不一致によると考えられる。
https://qiita.com/ponsuke0531/items/fae6b9a64163cef51d2e
解決方法は、
①PHPのバージョンを調べる
②PHPと同じバージョン(32 OR 64)のOracle Instant Clientをダウンロードして適当に解凍。
③PHPフォルダの直下(ここが一番優先されるみたい)に、上記のフォルダで、.dllとなっているものをすべて打ち込む。
④php.iniのファイルを修正(下記、記事を参考)
⑤Apacheの再起動
⑥phpinfo()で確認して、「PDO_OCI」と言う項目ができて、enableとなっていれば完璧。
上記を参考に。
うーん・・・なかなか、大変だった。