このページに記載の情報は、2005 年にリリースした PowerGres Plus V2 を対象としています。PowerGres Plus V2 の販売はすでに終了しています。
PowerGres Plus の最新バージョンに関する情報は、製品紹介ページまたは PowerGres 体験記ページを参照してください。
SRA OSS では、Oracle データベースなど他のデータベースから、PostgreSQL や PowerGres へのマイグレーションサービスを提供しています。
詳細は「データベースマイグレーションサービス」のページをご覧ください。
近頃では、Web アプリケーションはさまざまな業務に欠かせません。 一言にアプリケーションと言ってもさまざまな形態、プログラミング言語があります。 Web アプリケーションの主流となるプログラミング言語に PHP があります。 PHP は Perl 言語を元にした言語で、データベースアクセスを最初から意識した関数を装備しているため、データベースを手軽に扱えるスクリプト言語として普及し、今では、さまざまな Web サイトで見かけます。
PowerGres Plus は、PostgreSQL で使用可能なさまざまなプログラムインタフェースを使ってアプリケーションを作ることができ、PHP を使ったアプリケーションも作ることができます。 Oracle からの PHP アプリケーションの移行は、関数名のプレフィックスの変更により簡単に行うことができます。
第 4 回目となる今回は、PHP アプリケーションの移行とそのポイントについて紹介します。
図 1: データベース移行の概要
図 2: アプリケーションの概要
サンプルアプリケーションは、oracle_to_powergresplus.zip という名前で サンプル一覧 にあります。 oracle_to_powergresplus.zip を解凍すると、以下のようにアプリケーションの実行に必要なファイルが展開されます。
それぞれのフォルダの詳細を以下に説明します。
Oracle 用の Web アプリケーションの php ソースです。 以下にファイル名と一覧を表示します。 プレフィックスとして「inc_」で始まるファイルはすべて、PHP のインクルードファイルです。 インクルードファイルは、共通の画面の表示や、共通の処理を行う場合に作成すると、同じ処理を何度も記述しなくて済むので便利です。
検索画面 (初期画面) 検索条件を指定して物件を検索する画面です。
検索結果一覧画面 検索画面から、条件にあった物件の一覧を表示する画面です。
検索結果詳細画面 検索結果一覧画面から、詳細情報を表示するボタンをクリックしたとき、その物件の詳細情報を表示する画面です。
検索結果物件の画像表示用画面 検索物件の外観、間取り、内装などを表示するための画面です。
データベースへの接続、切断、検索を行うための処理が記述されている、インクルードファイルです。
検索画面で入力した条件より、検索用の SQL コマンドを作成するインクルードファイルです。
検索結果一覧を表示するためのインクルードファイルです。
検索結果一覧と、検索結果詳細を表示するためのインクルードファイルです。
検索画面に戻るための処理が記述されたインクルードファイルです。
検索結果一覧画面に戻るための処理が記述されたインクルードファイルです。
移行後の PowerGres Plus 用の php ソースです。 ファイル名と用途は plus フォルダと同じです。
php ソースで使用するボタンなどの gif ファイルが格納されています。
賃貸物件の間取りや、外観などの画像ファイルが格納されています。
賃貸物件の間取り図の画像ファイルを格納するフォルダです。
賃貸物件の内装写真の画像ファイルを格納するフォルダです。
賃貸物件の地図の画像ファイルを格納するフォルダです。
賃貸物件の外観写真の画像ファイルを格納するフォルダです。
ブラウザでWebページを表示するときに使用するフォーマットを記述したカスケード・スタイル・シートを格納します。
次に、Oracle アプリケーションを PowerGres Plus 用に変更するための手順を紹介します。 なお、今回紹介した、移行後の PowerGres Plus のサンプルをそのまま使用できる手順も、「Oracle マイグレーション 第 4 回 番外編」に紹介してありますので、ご覧ください。
PHP を使ったアプリケーションは、PHP プログラム中の関数名を変更して、SQL コマンドを PowerGres Plus 用に手直しすることで、移行することができます。
図 3: アプリケーション移行の概要
最初に、PHP を移行しましょう。 今回のサンプルでは、PHP 5.1.1 を使用することを前提に説明します。 PHP の移行では、処理ロジックそのものを変更する必要はありません。 単に、データベースにアクセスする関数のプレフィックスとコネクション情報を変更するだけです。 サンプル一覧 の oracle_to_powergresplus.zip を解凍して作成された oracle フォルダの PHP ファイルを変更します。
この処理は、すべての PHP ファイルに対して行います。 Oracle にアクセスする関数名は、すべてプレフィックス「oci_」で始まっています。 これを、PowerGres Plus (PostgreSQL) にアクセスする関数名で使っているプレフィックス「pg_」に変更します。 汎用エディタの一括置換機能などを使うと簡単にできます。 ただし、いくつかの関数については、パラメタや復帰値の変更も必要となります。 詳しくは、「付録: Oracle と PowerGres Plus の変更点一覧」を用意しましたので、そちらをご覧ください。
Oracle と PowerGres Plus (PostgreSQL) では、コネクション情報の書き方に違いがあります。 この処理は、inc_global.php に対して行います。
実際に変更してみます。 Oracle を使った Web アプリケーションでは、次のように記述されています。
$con = oci_connect ("postgres","postgresplus");
最初のパラメタ「postgres」はデータベースにアクセスするためのユーザ名で、2 番目のパラメタ「postgresplus」はパスワードです。
PowerGres Plus (PostgreSQL) では、コネクション情報は全て一つの文字列パラメタの中に記述します。
$con = pg_connect ("host=192.168.0.2 dbname=postgres user=postgres password=postgresplus port=5432");
今回の移行では、Oracle と PowerGres Plus で同様のユーザ、パスワードが登録されているので、変更の必要はありません。 Oracle と異なるユーザ、パスワードを使用する場合は、「user」、および、「password」を変更する必要があります。 また、「host」は、PowerGres Plus のデータベースを作成したサーバ名、または、IP アドレスを指定します。
pg_connect 関数の詳しい情報は PHP の関数リファレンスに記載されていますので、そちらをご覧ください。 PHP のマニュアルは、インストール媒体に含まれています。
続いて、PHP 内で発行している SQL コマンドを移行します。 Oracle 固有の SQL コマンドを使っている場合は、それを PowerGres Plus で使用可能な SQL コマンドに変更します。 Oracle と PowerGres Plus の SQL コマンドの主な違いについては、「付録: Oracle と PowerGres Plus の変更点一覧」を用意しましたので、ご利用ください。
今回の Web アプリケーションで使用している SQL コマンドを調べた結果、以下の箇所を移行すれば良いことがわかりました。
変更点
それでは、順番に見ていきましょう。
row_number() という Oracle 内部関数を使って、between 述語により、取り出すレコードの開始位置と終了位置を指定しています。 PowerGres Plus は limit と offset を使うことで、同じことができます。
$part_query = "select main_no, address, route_name, nearest_station, method_of_trans, TIME_OF_TRANS, rent, FLOOR, ARRANGEMENT, SQUARE, house_type, DATE_OF_BUILD, enquipment, promotion, DIRECTION, h_LIMIT, DATE_OF_MOVE, pub_date, update_date, pic_of_arrangement, photo_of_appearance,photo_of_interior, map,row_number() over ( order by ".$query_sort. $query_sortby ." ) rn from house_detail_view " . $query; $second_query = "select * from ( ". $part_query ." ) where "; $second_query = $second_query . "rn between " . $pos_start . " and " . $pos_end;
$second_query = "select * from house_detail_view " . $query . "order by ".$query_sort. $query_sortby ." limit " . $_POST['k_hyouji'] . " offset " . $pos_start;
ここで、気をつけなければならないのは、Oracle では、開始位置と終了位置で取り出す範囲を記述しているのに対して、PowerGres Plus (PostgreSQL) では、開始位置と件数となっている点です。
PowerGres Plus (PostgreSQL) では、SQL コマンドはかなり簡単になりました。
REGEXP_LIKE という内部関数を使って正規表現による判定を行っています。 PowerGres Plus (PostgreSQL) では、similar to という演算子を使うことで同じことができます。
$temp = "REGEXP_LIKE ( ARRANGEMENT, '1(D)?K' )";
$temp = "ARRANGEMENT SIMILAR TO '1(D)?K' ";
Oracle の SYSDATE 関数を、PowerGres Plus (PostgreSQL) では、current_timestamp 関数を使うことで、同じことができます。 ただし、SYSDATE 関数と current_timestamp 関数では、返却値が異なるため、PowerGres Plus (PostgreSQL) では、「DAY TO SECOND」という記述も削除します。
$query_DaysPassed = "EXTRACT(DAY FROM (SYSDATE - pub_date) DAY TO SECOND )*24+EXTRACT(HOUR FROM (SYSDATE - pub_date) DAY TO SECOND )
$query_DaysPassed = "EXTRACT(DAY FROM (current_timestamp - pub_date))*24+EXTRACT(HOUR FROM (current_timestamp - pub_date))
設備のデータを処理するために、clob 型を使っています。 PowerGres Plus (PostgreSQL) では text 型を使います。 clob 型ではデータを参照するために、load() メソッドを使わなければなりませんが、text 型ではそのまま参照できます。
$equipment_rowdata['ENQUIPMENT'] = htmlspecialchars($equipment_rowdata['ENQUIPMENT']->load());
$enquipment_rowdata['enquipment'] = htmlspecialchars($enquipment_rowdata['enquipment']);
これで、Web アプリケーションのプログラムの変更が終わりました。 あとは、Web アプリケーションを実行するための環境を PowerGres Plus 用に変更します。
今回の Web アプリケーションは、Apache と PHP を使っています。 Apache と PHP は次のバージョンを使います。
Web アプリケーションが使っている PHP プログラムのファイルの格納場所を設定します。 移行前と後で、同じ場所に PHP プログラムを置く場合は変更する必要はありません。 今回は、わかりやすいように、PowerGres Plus 用のファイルを「/home/postgres/migrate_from_orcle/soft/house/Apache/htdocs/plus」に格納しました。 また、oracle_to_powergresplus.zip を解凍して作成された以下のフォルダもフォルダごと、「/home/postgres/migrate_from_orcle/soft/house/Apache/htdocs/」に格納します。
次に、Apache の httpd.conf というファイルに記述されている「DocumentRoot」パラメタの値を書き換えます。
DocumentRoot "/home/postgres/migrate_from_orcle/soft/house/Apache/htdocs"
提供しているサンプルをそのまま使う場合は、plus フォルダごと、「DocumentRoot」パラメタに指定したフォルダに格納してください。
PHP から PowerGres Plus と連携するためには、PHP を「–with-pgsql」オプションをつけて再構築しなければなりません。 そのために、PHP をもう一度 configure して、make し、インストールします。 configure を行うときには、「–with-pgsql」オプションを以下のように指定します。
–with-pgsql=/usr/local/pgsqlplus
実際の例を以下に記述します。 インストールは、root で行います。
$ ./configure --with-apxs=/home/postgres/migrate_from_orcle/soft/house/Apache/bin/apxs --with-config-file-path=/home/postgres/migrate_from_orcle/soft/house/php_conf --enable-mbstring --with-pgsql=/usr/local/pgsqlplus $ make # make install
httpd.conf を書き換えただけでは、その内容は実行環境に反映されません。 変更内容を実行環境に反映するために、Apache を再起動します。
$ /home/postgres/migrate_from_orcle/soft/house/Apache/bin/apachectl restart
それでは動作を確認してみましょう。 次の URL を入力して Web アプリケーションのトップページを表示します。
Top ページは、index.php というファイル名です。 以下の URL を入力してアプリケーションを起動します。
https://localhost/plus/
「localhost」は、Apache をインストールしたサーバ名を指定します。
図 4: 賃貸情報検索画面
検索条件を入力して、この条件で検索 ボタンをクリックします。
以下のように検索結果が表示されます。
図 5: 実行結果画面
今回は、PHP により記述された Web アプリケーションを、Oracle から PowerGres Plus へ移行する方法について紹介しました。 PHP の関数のプレフッィクスを変更し、一部の SQL コマンドの違いを修正することで、簡単に移行できることができることを紹介しました。 移行した Web アプリケーションは、サンプルとして公開していますので、参考にしてください。 今回は説明できませんでしたが、SQL の移行にはキーワードの違いも考慮する必要が出てくるかもしれません。 例えば、「limit」は、Oracle ではキーワードではありませんが、PowerGres Plus ではキーワードとなっています。
次回は、アプリケーションの一部としてよく使用されるストアドプロシジャの移行について紹介します。
変更前 (oracle 用) | 変更後 (plus 用) |
---|---|
oci_close | pg_close |
oci_fetch_array | pg_fetch_array |
oci_error() | pg_last_error() |
変更前 (oracle 用) | 変更後 (plus 用) |
---|---|
oci_parse() | |
oci_execute() | pg_query() |
oci_free_statement() | pg_free_result() |
oci_fetch_all() | pg_num_rows() |
oci_connect() | pg_connect() |
項目 | Oracle | PowerGres Plus |
---|---|---|
列の別名 | 「AS」省略可 | 「AS」が必須 |
結果の部分取り出し | ROWNUM LINE BETWEEN |
OFFSET OFFSET 〜 LIMIT |
アウタージョイン | 拡張構文「(+)」 | 標準の記述形式 |
FROM 句副問合せ | エイリアス必要無 | エイリアス必須 |