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
↑にあった改変を試すも失敗した。
データベース名.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% [?]




