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



last updated
2002/01/20

counter hits
since 1999/11/06


裏Oracle関数マニュアル

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

function/oracle.c や function/oci8.c を見てみると、PHP マニュアルに載っていない裏関数がいくつか存在します。ここでは、以前に調査した(3.0.12jp-beta4の頃です)時の結果を書いています。

Ora_ColumnSize  int Ora_ColumnSize(int cursor, int column)

Oracle のカラムサイズを取得します。以下のサンプルを見ていただくとお分かりのように、基本的にバイト数が帰ってきますが、DATE 型は 7byte、数値型は 22byte となりますす。


<?php
    $conn = Ora_Logon( "scott@orcl", "tiger" );

    $cursor = Ora_Open($conn);
    $sql  = "SELECT * FROM emp";
    Ora_Parse($cursor, $sql);
    Ora_Exec($cursor );
    for ($i=0; $i < $Ora_NumCols($cursor); $i++) {
        echo "col[$i]=".Ora_ColumnName($cursor, $i)."  ";
        echo "col[$i]=".Ora_ColumnSize($cursor, $i)."<BR>";
    }
    Ora_Close($cursor);
    Ora_Logoff($conn);
?>

Ora_Do  int Ora_Do(int connection, string sql_statement)

カーソルオープン・パース・実行・1行だけFETCH をこの1関数で行います(便利!)。戻り値は、オープンしたカーソルを返します。


<?php
    $conn = Ora_Logon( "scott@orcl", "tiger" );

    $sql  = "SELECT count(*) FROM emp";
    $cursor = Ora_Do($conn, $sql);
    echo "ret=".Ora_GetColumn($cursor, 0);
    Ora_Close($cursor);
    Ora_Logoff($conn);
?>

Ora_Fetch_Into  int Ora_Fetch_Into(int cursor, array &result, int [mode])

SELECT されたレコードを配列に格納し、カラム数を返します。カラム名に別名を付けた場合は、その別名が key として返ります。mode パラメータによりデフォルト動作の変更を可能となります。

  • 0 = 添字 0 から始まる配列を返す(値が NULL であるカラムは、key 自体返されない。デフォルト)
  • 1 = 連想配列を返す(値が NULL であるカラムは、key 自体返されない。ORA_FETCHINTO_ASSOC でも可)
  • 2 = 添字 0 から始まる配列を返す(ORA_FETCHINTO_NULLS でも可)
  • 3 = 連想配列を返す

また、mode > 3 以降これを繰り返すようで、動作もします。


<?php
    if ($mode == "") $mode = "0";

    $conn = Ora_Logon( "scott@orcl", "tiger" );

    $cursor = Ora_Open($conn);
    $sql  = "SELECT * FROM emp ORDER BY empno";
    Ora_Parse($cursor, $sql);
    Ora_Exec($cursor );
    while($ret = Ora_Fetch_Into($cursor, &$arr, $mode)){
        echo "\$ret=$ret<br>";
        while (list($key, $val) = each($arr)) {
            echo "$key => $val<br>";
        }
        /* 連想配列をクリア */
        $arr = (array)$arr_tmp;
    }
    Ora_Close($cursor);
    Ora_Logoff($conn);
?>

Ora_NumCols  int Ora_NumCols(int cursor)

カラムの数を返します。Ora_Exec 後に値が入ります。


<?php
    $conn = Ora_Logon( "scott@orcl", "tiger" );

    $cursor = Ora_Open($conn);
    $sql  = "SELECT * FROM emp";
    Ora_Parse($cursor, $sql);
    Ora_Exec($cursor );
    $cols = Ora_NumCols($cursor);
    echo "cols=$cols<BR>";
    for ($i=0; $i < $cols; $i++){
        echo "col[$i]=".Ora_ColumnName($cursor, $i)."<BR>";
    }
    Ora_Close($cursor);
    Ora_Logoff($conn);
?>

Ora_NumRows  int Ora_NumRows(int connection)

現時点での結果レコード数を返します。SELECT 文でなら FETCH したレコード数、INSERT/UPDATE/DELETE 文なら、作用したレコード数となります。


<?php
    $conn = Ora_Logon( "scott@orcl", "tiger" );

    $cursor = Ora_Open($conn);
    $sql  = "SELECT ename FROM emp";
    Ora_Parse($cursor, $sql);
    Ora_Exec($cursor );
    echo "rows=".Ora_NumRows($cursor)."<BR>";
    while (Ora_Fetch($cursor)){
        echo "rows=".Ora_NumRows($cursor)."<BR>";
        echo "COUNT=" . Ora_GetColumn($cursor, 0) . "<BR>";
    }
    Ora_Close($cursor);
    Ora_Logoff($conn);
?>

Ora_PLogon  int ora_plogon(string user, string password)

Oracle 8 関数の OCIPLogon と同様に、Apache モジュールとして make したときのみ有効で、持続的接続を オープンし、ログオンします。これは、Oracle の動的ディクショナリ v$session を見ていると分かります。以下のサンプルのように、Ora_PLogon した後も session が残っており、別ページで Ora_PLogon したときに接続速度が向上しているのが(マシンのスペックによっては?)体感できます。PHPマニュアルのOCINLogonの説明に、「接続は、OCILogon()を使用した場合はページレベルで共有され、OCIPLogon()を使用した場合はWebサーバープロセスレベルで共有されます」とありますので、PHP側でOracleとのSessionを削除することはできないようで、Web サーバ(Apache)の設定によりsession数などが決定されるようです。


<?php
    $conn = Ora_PLogon( "scott@orcl", "tiger" );

    :(何らかの処理)
?>



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