PHP(Linux)でOracleに接続 接尾辞の使用によるコードヒントの表示について
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

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

Leave a Reply