3月 05

Oracleにはtnsnames.oraという接続情報(プロトコル、ホスト、サービスネーム、ポートなど)が含まれた構成ファイルがある。これで管理しなさいということなんだろう。

なのでtnsnames.oraがある場合PEAR::DBやDB_DataObjectに記述するdsnには以下のような感じにする。

$dsn = oci8://ユーザー名:パスワード@TNS名

当然、TNS_ADMINを/etc/sysconfig/httpdに記述しておく必要がある。
なんだか設定が分散してるような感じがして嫌だけど、しかたない。

とりあえず、これでcreateTablesもできるし、簡単な取得もできるけど問題発生。DB_DataObjectが作ってくれるデータベース名.iniが作成されない。tnsnames.oraに接続情報があるのでDB_DataObjectがデータベース名を取得できていない。調べているとダミーでいいのでデータベース名を一緒に記述しておく必要があるようだ。というわけで以下のように変更すればOK。

$dsn = oci8://ユーザー名:パスワード@TNS名/データベース名

ちなみに

$dsn = oci8://ユーザー名:パスワード@ホスト名:ポート番号/データベース名

としてもPEAR::DBの場合接続できない。上記のdsnはちゃんとホスト名($dsn['hostspec'])やポート番号($dsn['port'])…というようにparseはされてはいるが、oci8関数を利用する環境の場合、最終的にoci_connect関数に引き渡す第3引数($db)のホスト名が無視されてて、順序も変な感じになってしまっているためだ(MDB2は見てない)。TNSで管理しろってことなのだろうか?

× $con = oci_connect(’ユーザー名’, ‘パスワード’, ’//データベース名:ポート番号’); ← こうなってしまう

○ $con = oci_connect(’ユーザー名’, ‘パスワード’, ’//ホスト名:ポート番号/データベース名’);

というわけでdnsにはTNS名にデータベース名もつけてcreateTablesしてみたとことろ、Primary Keyが取得できていない…orz

PEAR::DBでOracleをもうちょっと便利に(1)

↑にあった改変を試すも失敗した。
データベース名.iniに自分で記述するか、keys()メソッドで指定するしかないのだろうか…。
どうもoracleへの対応は割りと適当なようだ….。

尚、portabilityを設定するにはDB_DataObjectの設定ファイルに

[DB]
portability = 63

を頭に記載しておくとcreateTablesしたときに作成される、データベース名.ini のフィールド名は小文字になってくれる。
※多分63がDB_PORTABILITY_ALLの値と思われる。

DB_DataObjectで実際に使うときには上記設定は無視されていて、

$dbo = DB_DataObject::factory(’hoge’);
$db =& $dbo->getDatabaseConnection();
$db->setOption(’portability’, DB_PORTABILITY_ALL);

などとしなくてはならないようだ…。ううう、なんだこの面倒くささは…。なんかないのだろうか。

[参考]
PEARのMDB2+DB_DataObject+Oracle

Popularity: 12% [?]

written by joy-pop

3月 04

CentOSでソースRPMを使う方法は以下とかを参考に…

ソースからコンパイルする方法は以下を参考に…

Fedora(PHP5.1.6)の場合はもっと簡単でした

  1. 必要なInstant Clientパッケージをダウンロードする。
    本家OTNに行くとrpmが用意されているので、今回はそれを利用。例によって基本とSDKをダウンロード。
  2. ダウンロードしたRPMをインストール。
  3. pecl install oci8を実行する。
    この時、Instant Clientのライブラリのパスを訪ねられるので
    instantclient,/usr/lib/oracle/10.2.0.3/client/lib
    を指定する。
  4. php.iniにextension=oci8.soを追記する。
  5. /etc/sysconfig/httpdにexport NLS_LANG=JAPANESE_JAPAN.UTF8を記述する。
  6. httpdをrestartする。

これだけで使えるようになる。 CodeZineにあるようなenvvarsがないので、どこにNLS_LANGを記述したら良いものだろうか?/etc/sysconfig/httpdでいいのだろうか?現在、問題なく日本語も取得できている。

Popularity: 18% [?]

written by joy-pop

3月 03

ODBCデータソースのドライバに標準で含まれるMicrosoft ODBC for Oracleは今一歩、おかしいという話なのでOracle Instant Clientを利用することにする。

  1. Oracle Technology Networkから必要なInstant Clientパッケージをダウンロードする。
    ※一応、基本とODBCをダウンロード(要ユーザー登録)
  2. 基本をC:\oracleとかに解凍して設置する。
    ※C:\oracle\instantclient_10_2
  3. ODBCの分も同じ場所に設置する。
  4. 環境変数PATHに上記設置パスを設定。
  5. 環境変数NLS_LANGをJAPANESE_JAPAN.JA16SJISに設定(DBのセッティングによる)。
  6. 接続設定ファイル(tnsnames.ora、sqlnet.ora)がある場合は、環境変数TNS_ADMINに設定ファイル設置パスを設定。
  7. ODBCパッケージに含まれているodbc_install.exeを起動する。
    ※これでODBCデータソースのドライバにOracle_in_instantclient10_2が追加されているはず。
  8. 上記を利用してDSNを追加し、さらにAccessで利用すればOK。

本家OTNでは最新版の11.1.0.6が配布されている。またOracle Data Access ComponentsをインストールすればUniversal Installerで自動的にインストールされる。ただ自分にとってはまったく無駄なものばかりインストールされるので、今回の方法を選択した。

Popularity: 35% [?]

written by joy-pop