HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

Oracle 10g接続設定 - PHP実行環境改変メモ(4)

引き続き、自宅のPCのPHP環境の改変。

ためしにOracle 10g XEに接続してみる

PostgreSQLMySQLDB2とやって、Oracleだけやらないわけにもいかない(謎)ので、
とは言っても、Oracleはドライバが同梱されているので設定自体は簡単。
"php.ini"に次のような行があるので、今回は10gR2とコメントに書いてある方のコメントをはずす。

extension=php_oci8.dll      ; Use with Oracle 10gR2 Instant Client
;extension=php_oci8_11g.dll  ; Use with Oracle 11g Instant Client

これでApache httpdを再起動すれば、設定自体は完了。
あとは確認のために、次のようなスクリプトを実行してみる。

<pre><?php
    $oracle = oci_connect(
        'oracleadmin',
        'admin',
        '//localhost:1521/xe');

    $owner = 'SYS';
    $table = 'ALL_TAB_COLUMNS';
    $query =
        "SELECT TABLE_NAME, COLUMN_NAME"
        . " FROM all_tab_columns"
        . " WHERE OWNER = :p_owner AND TABLE_NAME = :p_table"
        . " ORDER BY COLUMN_ID";
    $stmt = oci_parse($oracle, $query);
    oci_bind_by_name($stmt, ':p_owner', $owner);
    oci_bind_by_name($stmt, ':p_table', $table);
    $success = oci_execute($stmt);
    while (($row = oci_fetch_assoc($stmt))) {
        print_r($row);
    }
    oci_free_statement($stmt);
    oci_close($oracle);
?></pre>

実行しているクエリは、条件で指定した表の列名一覧を取得するもの。

これを実行すれば、"all_tab_columns"表の列名一覧が表示されるはず。

ただひとつはまったのは、パラメータの値を指定したクエリを実行しようとしたときのこと。
当初、次のようなクエリにしていた。

    $query =
        "SELECT TABLE_NAME, COLUMN_NAME"
        . " FROM all_tab_columns"
        . " WHERE OWNER = :owner AND TABLE_NAME = :table"
        . " ORDER BY COLUMN_ID";
    $stmt = oci_parse($oracle, $query);
    oci_bind_by_name($stmt, ':owner', $owner);
    oci_bind_by_name($stmt, ':table', $table);

すると、次のようなエラーが‥

ORA-01745: ホスト/バインド変数名が無効です。

調べてみると、どうもPL/SQL予約語になっている単語はパラメータ名に使用できないらしい。

パラメータ名だということを表すためにコロン(':')がついているんじゃないのかとも思うのだが(ry