20/12/29(火) 02:32:43 *** 使用したOracle Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 以降で言う instantclient-basic とは、Oracle データベースにアクセスするためのソフトウェアです。(コマンドラインで SQL を入力できる SQL*Plus や開発に必要な dll、ドライバなど) Oracle が 11gR2 ならば、instantclient-basic も、同様のバージョンを用いること。 ただし、バージョンの後ろのほうは合ってなくても良い。 たとえば、 Oracle 11.2.0.1.0 client 11.2.0.4.0 11.2.0 くらいまであっていれば良い。 また、Perl が 32bit であるとき、instantclient-basic も 32bit でなければならない。 (64bitなら64bit。) なぜなら、Perl は instantclient-basic に含まれる dll ファイルを直接読むから。(32bit のソフトと 64bit のソフトは互いに読み取れない) なお、Oracle と instantclient-basic は 32bit で統一しなくても良い。 Oracle と instantclient-basic はネットワークを介してデータをやりとりするだけの関係だから。 https://qiita.com/towtow/items/a5c92482cca797456b86 このページに、exe ファイルが 32bit なのか 64bit なのか調べる方法が書かれている。 VisualStudio のランタイム(distributable)が必要。 (VisualStudio 本体ではない) この方法で、インストールしてある perl.exe の bit を調べた。 また、タスクマネージャや、コントロールパネルの「プログラムと機能」でも bit 数が表示されている。 instantclient-basic-nt-11.2.0.4.0.zip に含まれている7つのファイル oci.dll ocijdbc11.dll ociw32.dll orannzsbb11.dll oraocci11.dll oraociei11.dll orasql11.dll を、Perl の bin フォルダへコピーすること。 (ここでは、instantclient-basic のインストールは不要で、7つのファイルだけがほしい) コピーしておかないと、Perl が以下のようなエラーを出す。 Software error: install_driver(Oracle) failed: Can't load 'C:/usr/lib/auto/DBD/oracle/oracle.dll' for module DBD::oracle: load_file:指定されたモジュールが見つかりません。 (このメッセージのその場所(パス)の oracle.dll ではなく、別の場所で別のdll(7つ)を追加するのが正解、というのがきびしい) http://aibeeaqua.blog75.fc2.com/blog-entry-987.html このページで7つのファイルのコピーの話がされている。 SQL の結果に日本語が含まれる場合文字化けする。 Oracle は UTF-8 で、Perl も UTF-8 で出力しているが、漢字が ??? といった文字になってしまう。 Oracle の文字コードを調べる SQL 文 SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET' Perl スクリプトにてデータベースに接続する前に 環境変数 nls_lang=JAPANESE_JAPAN.AL32UTF8 を設定すれば文字化けしない。(Perl スクリプトが UTF-8 を使っている場合) https://oshiete.goo.ne.jp/qa/2439209.html この質問のベストアンサーに 環境変数 nls_lang を設定すると良い、とある。 https://www.Oracle.com/technetwork/jp/content/charcterset-250314-ja.pdf この14ページと、18ページに JAPANESE_JAPAN.AL32UTF8 という文字列を作る手掛かりがある。 接続時の DSN 文字列(Data Source Name。データの取り込み対象(データベースなど)を特定する文字列) この情報を参考にして、 $dsn = "dbi:mySQL:database=test;host=Localhost;port=3306"; https://qiita.com/uguis410/items/c276d27b7c2bab456b1fより このようにした $dbh = DBI -> connect( "dbi:Oracle:host=asuspc;service_name=orcl;port=1521;", "system", "**パスワード**" ) || die $DBI::errstr; database の記述は必要ないようだ。 関係ないもの: 各環境変数は nls_lang 以外は関係ない。 ODBC 関係のセットアップは不要。 instantclient-basic のダウンロードページ: 「Instant Client Downloads for Microsoft Windows 32-bit」 https://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html 「Instant Client Downloads for Microsoft Windows (x64) 64-bit 」 https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html Perl サンプル: 以下のサンプルは WEB ブラウザ(正確にはブラウザからアクセスしたサーバー上の Perl スクリプト)から同一 LAN 上の Oracle にアクセスして、SQL を送信し、ある table のデータを得ている。 [test.cgi] #!/usr/bin/perl use CGI::Carp qw(fatalsToBrowser); #エラー内容をブラウザに表示する use DBI; local( $res ); #文字化けしないために必要 $ENV{ 'nls_lang' } = "JAPANESE_JAPAN.AL32UTF8"; $dbh = DBI -> connect( "dbi:Oracle:host=asuspc;service_name=orcl;port=1521;", "system", "**パスワード**" ) || die $DBI::errstr; $sth = $dbh -> prepare( "select CODE, NAME, PRICE from fruit" ) or die $dbh -> errstr; $sth -> execute() or die $sth -> errstr; while ( my $str = $sth -> fetchrow_arrayref ) { local( $code, $name, $price ) = @$str; $res .= "$code, $name, $abc, $price
"; } $dbh->disconnect; #---output. #以下の<と>はすべて全角にしてあるので注意 print <<HERE; content-type:text/html <!DOCTYPE html> <head> <meta content="text/html; charset=UTF-8" http-equiv="content-type"> </head> <body style="background-color : white;"> $res </body> </html> HERE exit;