Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2002/11/03

counter hits
since 1999/11/06


OracleとDOMの簡単な連携

alertここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。

alertPHPマニュアル より。。。注意: この拡張は実験的なものではありません。しかしながら、PHP 5 では決してリリースされないでしょう。また、PHP 4 でのみ配布されます。 もし PHP 5 でDOM XML をサポートする必要がある場合、 DOM 拡張を使用することができます。 この domxml 拡張は DOM 拡張と互換性はありません。

PHPのDOM XML関数を使った例として、OracleSELECTしたデータをそのままXML形式で出力するサンプルを作ってみました。イメージは、Oracle8.1.7iから標準で付属しているツール「Oracle XDK」で、カラム名がそのまま要素名(タグ名)にしています。

memoPEARでは、XML_sql2xmlパッケージが同様の機能を持っているようです

●PHPスクリプト

<?php
    /**
     * Oracle関連の前処理
     */
    $conn = OCILogon("scott", "tiger", "orcl");
    $sql = "SELECT * FROM emp";
    $stmt = OCIParse($conn, $sql);
    OCIExecute($stmt);
    $col = OCINumCols($stmt);

    /**
     * 出力されるXMLはUTF-8であることに注意!
     */
    if(!$doc = domxml_new_xmldoc("1.0")) {
        echo "Error while parsing the document\n";
        exit;
    }

    /**
     * XMLデータの作成開始
     */
    $root = $doc->add_root("data");

    $cnt = 0;
    while (OCIFetch($stmt)) {
        $rows = $root->new_child("rows", "");

        // 属性として行番号
        $rows->set_attribute("num", ++$cnt);

        for ($i = 1; $i <= $col; $i++) {
            /**
             * Fetchしたデータの文字コードをUTF-8に変換
             * ちなみに、今回の環境の文字コードは、
             *  ・DB:JA16SJIS、
             *  ・php.ini:mbstring.internal_encoding = EUC-JP
             *  ・ソースコード:EUC
             * です。
             */
            $col_name = mb_convert_encoding(OCIColumnName($stmt, $i), "UTF-8", "EUC");
            $rows->new_child($col_name, mb_convert_encoding(OCIResult($stmt, $col_name), "UTF-8", "EUC"));
        }
    }

    OCIFreeStatement($stmt);
    OCILogOff($conn);

    // XMLツリーの出力
    echo $doc->dumpmem();
?>

●出力結果
<?xml version="1.0"?>
<data>
  <rows num="1">
    <EMPNO>7369</EMPNO>
    <ENAME>SMITH</ENAME>
    <JOB>CLERK</JOB>
    <MGR>7902</MGR>
    <HIREDATE>80-12-17</HIREDATE>
    <SAL>800</SAL>
    <COMM/>
    <DEPTNO>20</DEPTNO>
  </rows>
    <rows num="2">
    <EMPNO>7499</EMPNO>
    <ENAME>ALLEN</ENAME>
    <JOB>SALESMAN</JOB>
    <MGR>7698</MGR>
    <HIREDATE>81-02-20</HIREDATE>
    <SAL>1600</SAL>
    <COMM>300</COMM>
    <DEPTNO>30</DEPTNO>
  </rows>
     :
</data>
  


About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2002 by Hideyuki SHIMOOKA all rights reserved.