|
ここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコード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" );
:(何らかの処理)
?>
|