Delphi for PHPから oci8を利用してOracleへ接続する方法

概要: Delphi for PHPから oci8を利用して Oracleへ接続する方法を説明いたします

blank

PHP環境からOracleへ接続する手段として、いくつか方法がございますが、

ここでは、PHP用のoci8拡張モジュール(php_oci8.dll)を利用した接続方法を紹介します。

blank

    oci8拡張モジュールのロードを有効にする

blank

php_oci8.dllファイルは、Delphi for PHPと一緒にインストールされ、以下のパスに配置されます。

<Delphi for PHP_HOME>/php/ext/php_oci8.dll

例えば、Delphi for PHP v2.0の場合のデフォルトパスは、C:\Program Files\CodeGear\Delphi for PHP\2.0 です。

blank

Delphi for PHPでは、デフォルトでoci8拡張モジュールのロードが行われないため、

php.iniファイルの内容を修正し、PHP起動時に拡張モジュールがロードされるように設定する必要があります。

blank

通常、PHPの実行環境では、php.iniを参照しますが、Delphi for PHPでは、php.ini.templateを参照します。

よって、Delphi for PHPを利用した開発段階では、php.ini.templateファイルを修正してください。

このファイルは、以下のパスに配置されます。

<Delphi for PHP_HOME>/php/php.ini.template

上記ファイルをテキストエディタで開き、

;extension=php_oci8.dll

という行を検索してください。

もし該当する行が見つかったら、以下の図のようにコメントを外してください。

Hide image
php

blank

ファイルを保存した後、Delphi for PHPを再起動してください。

blank

またoci8拡張モジュールを利用するためには、同じ実行環境内にOracleクライアントファイル(例えば、oci.dllなど)が必要になります。

環境変数PATHで上記ファイルが置かれたフォルダにパスが通っているか確認ください。

blank

    Delphi for PHPを起動すると、oci8拡張モジュールのロードに失敗する(Oracle8i/9iクライアント)

blank

Oracleクライアントとして 8i 、もしくは9iを利用している環境で、Delphi for PHPを起動すると、以下のようなdllファイルのロードに失敗することがあります。

blank

Hide image
LoadError1

Hide image
Click to see full-sized image

blank

http://php.oss.eznetsols.org/manual/ja/oci8.requirements.php

http://bugs.php.net/bug.php?id=37220

blank

これらのWebページの情報によると、PHP 5.1.2以降のバージョンでoci8拡張モジュールを利用した場合、

上記のようなエラーが発生いたします。

Delphi for PHP v2.0(Update1)にビルトインされているPHP バージョンは、5.2.6となるため、やはり報告されている事例と同様のエラーが発生することになります。

blank

現状 oci8拡張モジュールを利用する上での制約(仕様)として

Oracle 10g以降のクライアント、もしくはInstant Clientが必要になります。

blank

Oracleクライアントは上位互換を持っているため、Oracleデータベースサーバーのバージョンと一致していなくても接続は行えます。

例えば、Oracle 10gクライアントからOracle 9iのサーバーへ接続することは可能です。

blank

もし上述した事例に相当し、Oracle10g以降のクライアントへ移行することが可能でしたら、クライアントのバージョンを置き換えてください。

blank

以下のWebページからOracle Instant Clientのダウンロードが行えます。

http://www.oracle.com/technology/global/jp/tech/oci/instantclient/instantclient.html

(但し、別途 OTNのアカウントが必要)

blank

Oracle Instant Clientをインストール後の設定については、以下のWebページをご覧ください。

http://otndnld.oracle.co.jp/document/products/oracle10g/102/windows/B25691-02/post_install.htm

blank

    Delphi for PHPからOracleへ接続する

blank

ここでは、oci8拡張モジュール(php_oci8.dll)+Oracle Instant Clientを利用し、

Oracleデータベースサーバーへ接続する簡単な手順を紹介いたします。

blank

    (1)データエクスプローラの設定

Hide image
Click to see full-sized image

blank

上記の設定では、tnsname.oraを参照し、接続先のOracleインスタンスを解決する方法ではなく、

データエクスプローラの[接続パラメータ]-[データベース名]として直接、 Oracle インスタンスに対する接続アドレスを指定しています。

上記のORCL9iは、Oracleのサービス名となります。

blank

尚、データエクスプローラから[Tables]を開いた時、以下のエラーが発生することがあります。

Hide image
NLS

blank

上記は、環境変数 NLS_LANGが設定されていないことが原因なため、もし該当する環境変数が

無い場合には、指定してください。

NLS_LANGの詳細につきましては、Oracleのマニュアル「Oracle Application Serverグローバリゼーション・ガイド」を参照ください。

blank

ここでは、例として環境変数NLS_LANGを”Japanese_Japan.JA16SJIS”で設定します。

blank

    (2)フォームへデータベースコンポーネントを配置する

blank

[ファイル]-[新規作成]-[アプリケーション]からフォームを作成します。

そして、データエクスプローラから”SCOTT.EMP”テーブルをドラッグし、

blank

Hide image
DE2

blank

  • フォームへドロップします。

blank

Hide image
Form2

    (3)データベースコンポーネントのプロパティを変更する

blank

Databaseコンポーネントの”DriverName”プロパティを”oci8”に設定する

Hide image
Database
blank

Tableコンポーネントの”TableName”プロパティを”SCOTT.EMP”から“EMP”へ変更する

blank

    (4)アプリケーションを実行

アプリケーションを実行し、Webブラウザで表示内容を確認する

blank

Hide image
Result

blank

Delphi for PHPの現状の不具合により、スキーマ名が含まれているテーブル

(例えば、「SCOTT.EMP」など) はWebブラウザでエラーが生じ、正しく表示できないことがあります。

その場合には手順(3)のようにスキーマ名を明示的に削除することで、この不具合を回避することができ、

Webブラウザで正しく表示することができます。

blank

以上、Delphi for PHPでOracleへ接続する方法に関する紹介でした。