LXXXVIII. Oracle 8 関数

導入

これらの関数は Oracle9, Oracle8, Oracle7 データベースへのアクセスを可能にします。 この拡張モジュールは Oracle Call Interface (OCI) を使用します。

この拡張モジュールは、通常のOracle 拡張モジュールより柔軟性があります。 この拡張モジュールは、グローバルおよびローカルの PHP 変数の Ocacle プレースホルダーへのバインドをサポートします。また、LOB,FILE,ROWID を完全にサポートしており、ユーザー定義の変数が使用可能です。 可能であれば 通常の Oracle 拡張モジュールの代わりにこの拡張モジュールを使用することをお勧めします。

要件

この拡張を使用するために Oracle クライアントライブラリが必要になります。 Windows ユーザは php_oci8.dll を使用するために 少なくとも Oracle 8.1 が必要になるでしょう。

この拡張モジュールを使用する前に Webデーモンのユーザでもある OracleユーザのOracle用環境変数が正しく設定されていることを確認し てください。設定されている必要がある変数を以下に示します。

  • ORACLE_HOME

  • ORACLE_SID

  • LD_PRELOAD

  • LD_LIBRARY_PATH

  • NLS_LANG

  • ORA_NLS33

Webサーバーのユーザ用に環境変数を設定した後、Webサーバーのユーザ (nobody, www)をグループoracleに追加してください。

Webサーバが起動しないか、起動時にクラッシュする場合: Apacheがpthreadライブラリにリンクされているかどうか次のように確認 してください。

# ldd /www/apache/bin/httpd
    libpthread.so.0 => /lib/libpthread.so.0 (0x4001c000)
    libm.so.6 => /lib/libm.so.6 (0x4002f000)
    libcrypt.so.1 => /lib/libcrypt.so.1 (0x4004c000)
    libdl.so.2 => /lib/libdl.so.2 (0x4007a000)
    libc.so.6 => /lib/libc.so.6 (0x4007e000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

libpthread がこの一覧にない場合、Apacheを再インストールする必要 があります。

# cd /usr/src/apache_1.3.xx
# make clean
# LIBS=-lpthread ./config.status
# make
# make install

UnixWareのようないくつかのシステムでは、libpthreadの代わりに libthreadが使用されています。PHPとApacheは、 EXTRA_LIBS=-lthreadをconfigureに指定する必要があります。

インストール手順

オプション--with-oci8[=DIR]を指定 してPHPをコンパイルする必要があります。ただし、DIRのデフォルトは、 環境変数ORACLE_HOMEの値です。

もし Oracle Instant Client を使用しているならば、オプション --with-oci8-instant-client[=DIR] を使用して PHP を構築する必要があります。 Oracle Instant Client はバージョン 4.3.11 と 5.0.4 で最初にサポートされたことに注意してください。

実行用の設定

この拡張モジュールは設定ディレクティブを全く定義しません。

定義済みの定数

これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。

OCI_DEFAULT (integer)

文の実行モードを指定します。 このモードを使用する場合、 文は自動的にコミットされません。

OCI_DESCRIBE_ONLY (integer)

文の実行モードを指定します。 実際に文を実行したくないが取得一覧の記述は取得したい場合に このモードを使用してください。

OCI_COMMIT_ON_SUCCESS (integer)

文の実行モードを指定します。 文は、oci_execute() コールの後に自動的にコミットされます。

OCI_EXACT_FETCH (integer)

文の取得モードを指定します。 アプリケーションがあらかじめ何行取得すればよいか分かっている場合に 使用されます。 このモードは Oracle リリース 8 以降ではプリフェッチ機能をオフにします。 カーソルは希望する行を取得した後キャンセルされ、 サーバ側のリソースの使用は軽減されます。

OCI_SYSDATE (integer)

OCI_B_BFILE (integer)

oci_bind_by_name() で BFILE をバインドする場合に使用されます。

OCI_B_CFILEE (integer)

oci_bind_by_name() で CFILE をバインドする場合に使用されます。

OCI_B_CLOB (integer)

oci_bind_by_name() で CLOB をバインドする場合に使用されます。

OCI_B_BLOB (integer)

oci_bind_by_name() で BLOB をバインドする場合に使用されます。

OCI_B_ROWID (integer)

oci_bind_by_name() で ROWID をバインドする場合に使用されます。

OCI_B_CURSOR (integer)

oci_bind_by_name()oci_new_descriptor() によってあらかじめ割り当てられたカーソルをバインドする場合に使用されます。

OCI_B_NTY (integer)

oci_bind_by_name() で 名前付けされたデータ型をバインドする場合に使用されます。 注意: PHP < 5.0 では OCI_B_SQLT_NTY と呼ばれます。

OCI_B_BIN (integer)

SQLT_BFILEE (integer)

OCI_B_BFILE と等価です。

SQLT_CFILEE (integer)

OCI_B_CFILEE と等価です。

SQLT_CLOB (integer)

OCI_B_CLOB と等価です。

SQLT_BLOB (integer)

OCI_B_BLOB と等価です。

SQLT_RDD (integer)

OCI_B_ROWID と等価です。

SQLT_NTY (integer)

OCI_B_NTY と等価です。

OCI_FETCHSTATEMENT_BY_COLUMN (integer)

oci_fetch_all() のデフォルトのモードです。

OCI_FETCHSTATEMENT_BY_ROW (integer)

oci_fetch_all() での代わりのモードです。

OCI_ASSOC (integer)

oci_fetch_all()oci_fetch_array() で結果を連想配列で取得するために使用されます。

OCI_NUM (integer)

oci_fetch_all()oci_fetch_array() で結果を配列で取得するために使用されます。

OCI_BOTH (integer)

oci_fetch_all()oci_fetch_array() で結果を配列と連想配列の両方で取得するために使用されます。

OCI_RETURN_NULLS (integer)

oci_fetch_array() でフィールド値が NULL の場合に空の配列要素を取得するために使用されます。

OCI_RETURN_LOBS (integer)

oci_fetch_array() でディスクリプタの代わりに LOB の値を取得するために使用されます。

OCI_DTYPE_FILE (integer)

このフラグは oci_new_descriptor() に新しい FILE ディスクリプタを初期化するように伝えます。

OCI_DTYPE_LOB (integer)

このフラグは oci_new_descriptor() に新しい LOB ディスクリプタを初期化するように伝えます。

OCI_DTYPE_ROWID (integer)

このフラグは oci_new_descriptor() に新しい ROWID ディスクリプタを初期化するように伝えます。

OCI_D_FILE (integer)

OCI_DTYPE_FILE と等価です。

OCI_D_LOB (integer)

OCI_DTYPE_LOB と等価です。

OCI_D_ROWID (integer)

OCI_DTYPE_ROWID と等価です。

例 1. OCIに関するヒント

<?php
// by sergo at bacup dot ru

// コマンドの実行を遅延させるには、オプション OCI_DEFAULT を使用して
// ください
OCIExecute($stmt, OCI_DEFAULT);

// (クエリ結果取得後に)使用するデータを取得

$result = OCIResult($stmt, $n);
if (
is_object($result)) $result = $result->load();

// INSERT または UPDATE 命令の場合に使用

$sql = "insert into table (field1, field2) values (field1 = 'value',
field2 = empty_clob()) returning field2 into :field2"
;
OCIParse($conn, $sql);
$clob = OCINewDescriptor($conn, OCI_D_LOB);
OCIBindByName($stmt, ":field2", &$clob, -1, OCI_B_CLOB);
OCIExecute($stmt, OCI_DEFAULT);
$clob->save("some text");
OCICommit($conn);

?>

コマンドラインで実行するのと同様な手法により、ストアドプロシージャ に簡単にアクセス可能です。

例 2. ストアドプロシージャの使用法

<?php
// by webmaster at remoterealty dot com
$sth = OCIParse($dbh, "begin sp_newaddress( :address_id, '$firstname',
'$lastname', '$company', '$address1', '$address2', '$city', '$state',
'$postalcode', '$country', :error_code );end;"
);

// この命令は、:address_id を入出力変数、:error_code を出力変数として
// ストアドプロシージャ sp_newaddress をコールします。
// 続いて、以下のようにバインドを実行します。

   
OCIBindByName($sth, ":address_id", $addr_id, 10);
   
OCIBindByName($sth, ":error_code", $errorcode, 10);
   
OCIExecute($sth);

?>

目次
oci_bind_by_name --  Oracle プレースホルダーに PHP 変数をバインドする
oci_cancel -- カーソルからの読み込みをキャンセルする
oci_close -- Oracleとの接続を閉じる
OCI-Collection->append -- コレクションにオブジェクトを追加する
OCI-Collection->assign --  他の存在するコレクションからコレクションを割り当てる
OCI-Collection->assignElem -- コレクションの要素に値を割り当てる
OCI-Collection->getElem -- 要素の値を返す
OCI-Collection->free -- コレクションオブジェクトに関連付けられたリソースを解放する
OCI-Collection->max -- コレクション内の要素の最大数を取得する
OCI-Collection->size -- コレクションのサイズを返す
OCI-Collection->trim -- コレクションの最後から要素を切り取る
oci_commit -- 未解決の文をコミットする
oci_connect -- Oracle サーバへの接続を確立する
oci_define_by_name --  SELECT 実行中、定義用の PHP 変数を使用する
oci_error -- 最後に見つかったエラーを返す
oci_execute -- 文を実行する
oci_fetch_all -- 結果データの全ての行を配列に取得する
oci_fetch_array -- 結果データ空の次の行を連想配列または配列、またはその両方で返す
oci_fetch_assoc -- 結果データの次の行を連想配列で返す
oci_fetch_object -- 結果の次の行をオブジェクトとして返す
oci_fetch_row -- 結果データの次の行を配列で返す
oci_fetch -- 結果バッファーの次の行を取得する
oci_field_is_null -- フィールドが NULL であるかどうかを確認する
oci_field_name -- 文からのフィールド名を返す
oci_field_precision -- フィールドの精度を問い合わせる
oci_field_scale -- フィールドの桁数を問い合わせる
oci_field_size -- フィールドサイズを返す
oci_field_type_raw -- Oracle におけるフィールドの型を問い合わせる
oci_field_type -- フィールドのデータ型を返す
descriptor->free -- ディスクリプタに関連付けられたリソースを解放する
oci_free_statement --  文やカーソルに関連付けられた全てのリソースを解放する
oci_internal_debug -- 内部デバッグ用出力有効または無効にする
lob->append -- ラージオブジェクトを他のラージオブジェクトにデータを追加する
lob->close -- LOB ディスクリプタを閉じる
oci_lob_copy -- ラージオブジェクトをコピーする
lob->eof -- ラージオブジェクトのディスクリプタが EOF かどうかを調べる
lob->erase -- 内部 LOB データの特定の位置を消去する
lob->export -- LOB の内容をファイルに出力する
lob->flush -- LOB のバッファをサーバにフラッシュする、あるいは書き込む
lob->import -- ファイルデータを LOB にインポートする
oci_lob_is_equal -- 2 つの LOB/FILE ロケータの等価性を比較する
lob->load -- ラージオブジェクトの内容を返す
lob->read -- ラージオブジェクトの一部を読み込む
lob->rewind -- 内部ポインタをラージオブジェクトの先頭に移動する
lob->save -- データをラージオブジェクトに書き込む
lob->seek -- ラージオブジェクトの内部ポインタをセットする
lob->size -- ラージオブジェクトのサイズを返す
lob->tell -- ラージオブジェクトの内部ポインタの現在位置を返す
lob->truncate -- ラージオブジェクトを切りつめる
lob->writeTemporary -- 一時的なラージオブジェクトを書き込む
lob->write -- データをラージオブジェクトに書き込む
oci_new_collection -- 新しいコレクションオブジェクトを割り当てる
oci_new_connect -- Oracle サーバへの新規接続を確立する
oci_new_cursor -- 新規カーソル (ステートメントハンドル) を割り当て返す
oci_new_descriptor -- 空の新規 LOB あるいは FILE ディスクリプタを初期化する
oci_num_fields --  ある文における結果のカラム数を返す
oci_num_rows -- 文の実行で作用された行数を取得する
oci_parse -- 実行のために Oracle の文をパースする
oci_password_change -- Oracle ユーザーのパスワードを変更する
oci_pconnect -- 持続的接続を使用してOracle データベースに接続する
oci_result -- フェッチした行からフィールドの値を取得する
oci_rollback -- 未解決のトランザクションをロールバックする
oci_server_version -- サーバのバージョンを返す
oci_set_prefetch -- プリフェッチする行数を設定する
oci_statement_type -- OCI ステートメントの種類を返す
ocibindbyname -- Oracle プレースホルダーに PHP 変数をバインドする
ocicancel -- カーソルからの読み込みをキャンセルする
ocicloselob -- lob ディスクリプタを閉じる
ocicollappend -- コレクションにオブジェクトを追加する
ocicollassign --  他の存在するコレクションからコレクションを割り当てる
ocicollassignelem -- 要素値をコレクションのインデックス ndx に割り当てる
ocicollgetelem -- コレクションのインデックス ndx にある値を取得する
ocicollmax -- コレクションにある要素の最大数を取得する
ocicollsize -- コレクションのサイズを返す
ocicolltrim -- コレクションの最後から num 個の要素を切り取る
ocicolumnisnull -- 結果カラムが NULL であるかどうかを確認する
ocicolumnname -- カラムの名前を返す
ocicolumnprecision -- カラムの精度を問い合わせる
ocicolumnscale -- カラムの桁数を問い合わせる
ocicolumnsize -- 結果カラムサイズを返す
ocicolumntype -- カラムのデータ型を返す
ocicolumntyperaw -- Oracle におけるカラムの型を問い合わせる
ocicommit -- 未解決のトランザクションをコミットする
ocidefinebyname -- SELECT 実行中、定義用の PHP 変数を使用する
ocierror --  stmt|conn|globalに関する直近のエラーを返す
ociexecute -- 文を実行する
ocifetch -- 結果バッファーの次の行を取得する
ocifetchinto -- 結果配列の次の行を取得する
ocifetchstatement -- 結果データの全ての行を配列に取得する
ocifreecollection -- コレクションオブジェクトを削除する
ocifreecursor -- カーソルに関連づけられた全リソースを解放する
ocifreedesc -- ラージオブジェクト記述子を削除する
ocifreestatement -- ある文に関連する全リソースを解放する
lob->getBuffering -- ラージオブジェクトの現在のバッファリング設定を返す
ociinternaldebug --  内部デバッグ用出力有効または無効にする。デフォルトでは無効
ociloadlob -- ラージオブジェクトをロードする
ocilogoff -- Oracleとの接続を閉じる
ocilogon -- Oracle への接続を確立する
ocinewcollection -- 新しいコレクションを初期化する
ocinewcursor --  新規カーソル(命令ハンドル)を返す
ocinewdescriptor --  空の新規ディスクリプタLOB/FILE(LOBがデフォルト)を初期化する
ocinlogon -- Oracle データベースに接続し、新規接続にログオン、 新規セッションを返す
ocinumcols -- ある文における結果のカラム数を返す
ociparse -- クエリーをパースし、Oracle ステートメントを返す
ociplogon --  持続的接続を使用してOracle データベースに接続する
ociresult -- 取得された行におけるカラムの値を得る
ocirollback -- 未解決のトランザクションをロールバックする
ocirowcount -- 作用された行の数を得る
ocisavelob -- ラージオブジェクトを保存する
ocisavelobfile -- ラージオブジェクトファイルを保存する
ociserverversion -- サーバーのバージョン情報を有する文字列を返す
lob->setBuffering -- ラージオブジェクトのための現在のバッファリング設定を変更する
ocisetprefetch -- 事前取得するレコード数を設定
ocistatementtype -- OCI ステートメントの種類を返す
ociwritelobtofile -- ラージオブジェクトファイルを保存する
ociwritetemporarylob -- 一時的な blob を書き込む