[PHP-users 25526] PEAR::DBのoci8をHackしてみました

榮水貴行 t-eimizu @ aim.ac
2005年 5月 8日 (日) 17:34:26 JST


いつもおせわになります。榮水です

OracleとPEAR::DB, DB_DataObjectの組み合わせを
試しているのですが、DB_DataObjectのcreateTables.phpが
まともにスキーマを取得してくれない(特にテーブルのキーが取れない)
ため、PEAR::DBのoci8.phpに手を入れてみました。


1005行目付近を以下のように書き換えました。
(もとのSQL)
$q_fields = 'SELECT column_name, data_type, data_length, '
            . 'nullable '
            . 'FROM user_tab_columns '
            . "WHERE table_name='$result' ORDER BY column_id";

(書き換え後のSQL)
$q_fields= 'SELECT t.column_name, t.data_type, t.data_length, '
           . '     t.nullable, c.position '
           . 'FROM user_tab_columns t,'
           . '    (SELECT ucc.table_name, ucc.column_name, ucc.position'
           . '     FROM   user_constraints uc, user_cons_columns ucc'
           . '     WHERE  uc.owner = ucc.owner AND'
           . '            uc.constraint_name = ucc.constraint_name AND'
           . '            uc.constraint_type = 'P' AND '
           . '            uc.table_name = ucc.table_name) c "
           . "WHERE t.table_name = '$result' AND "
           . '      t.table_name = c.table_name(+) AND'
           . '      t.column_name = c.column_name(+) '
           . 'ORDER BY t.column_id';


さらに1026行目のあたりに手を入れました。
(もとの記述)
'flags' => (@OCIResult($stmt, 4) == 'N') ? 'not_null' : '',

(書き換え後の記述)
'flags' => ((@OCIResult($stmt, 4) == 'N') ? 'not_null' : '') .
           ((@OCIResult($stmt, 5) > 0) ? ' primary' : ''),


これで、今までnot_nullしか返していなかったものが、
プライマリキーの primary も一緒に返ってくるようになりました。

どなたかユニークキーとか外部キーとかも取れるようにしてみませんか?

*=================================*
株式会社エイム
榮水 貴行
Mail: t-eimizu @ aim.ac
*=================================*


PHP-users メーリングリストの案内