PowerGres

技術情報 | PowerGres体験記 | 第 4 回 アプリケーションと SQL コマンドの移行 – Oracle マイグレーション

このページに記載の情報は、2005 年にリリースした PowerGres Plus V2 を対象としています。PowerGres Plus V2 の販売はすでに終了しています。

PowerGres Plus の最新バージョンに関する情報は、製品紹介ページまたは PowerGres 体験記ページを参照してください。

SRA OSS では、Oracle データベースなど他のデータベースから、PostgreSQL や PowerGres へのマイグレーションサービスを提供しています。

詳細は「データベースマイグレーションサービス」のページをご覧ください。

第 4 回 アプリケーションと SQL コマンドの移行 『Web アプリケーションの移行』

はじめに

近頃では、Web アプリケーションはさまざまな業務に欠かせません。 一言にアプリケーションと言ってもさまざまな形態、プログラミング言語があります。 Web アプリケーションの主流となるプログラミング言語に PHP があります。 PHP は Perl 言語を元にした言語で、データベースアクセスを最初から意識した関数を装備しているため、データベースを手軽に扱えるスクリプト言語として普及し、今では、さまざまな Web サイトで見かけます。

PowerGres Plus は、PostgreSQL で使用可能なさまざまなプログラムインタフェースを使ってアプリケーションを作ることができ、PHP を使ったアプリケーションも作ることができます。 Oracle からの PHP アプリケーションの移行は、関数名のプレフィックスの変更により簡単に行うことができます。

第 4 回目となる今回は、PHP アプリケーションの移行とそのポイントについて紹介します。

データベース移行の概要

図 1: データベース移行の概要

サンプルアプリケーションの概要
今回は、賃貸物件を検索する Web アプリケーションを移行する場合を例として紹介します。 この Web アプリケーションは、Web サーバ (Apache) と、PHP を使って作られています。 この Web アプリケーションを Oracle から PowerGres Plus に移行してみましょう。

アプリケーションの概要

図 2: アプリケーションの概要

サンプルアプリケーションは、oracle_to_powergresplus.zip という名前で サンプル一覧 にあります。 oracle_to_powergresplus.zip を解凍すると、以下のようにアプリケーションの実行に必要なファイルが展開されます。

それぞれのフォルダの詳細を以下に説明します。

oracle フォルダ

Oracle 用の Web アプリケーションの php ソースです。 以下にファイル名と一覧を表示します。 プレフィックスとして「inc_」で始まるファイルはすべて、PHP のインクルードファイルです。 インクルードファイルは、共通の画面の表示や、共通の処理を行う場合に作成すると、同じ処理を何度も記述しなくて済むので便利です。

index.php

検索画面 (初期画面) 検索条件を指定して物件を検索する画面です。

house_result.php

検索結果一覧画面 検索画面から、条件にあった物件の一覧を表示する画面です。

house_result_detail.php

検索結果詳細画面 検索結果一覧画面から、詳細情報を表示するボタンをクリックしたとき、その物件の詳細情報を表示する画面です。

housePic.php

検索結果物件の画像表示用画面 検索物件の外観、間取り、内装などを表示するための画面です。

inc_global.php

データベースへの接続、切断、検索を行うための処理が記述されている、インクルードファイルです。

inc_gen_query.php

検索画面で入力した条件より、検索用の SQL コマンドを作成するインクルードファイルです。

inc_pageft.php

検索結果一覧を表示するためのインクルードファイルです。

inc_showalltable.php

検索結果一覧と、検索結果詳細を表示するためのインクルードファイルです。

inc_backtosearch.php

検索画面に戻るための処理が記述されたインクルードファイルです。

inc_backtosearchresult.php

検索結果一覧画面に戻るための処理が記述されたインクルードファイルです。

plus フォルダ

移行後の PowerGres Plus 用の php ソースです。 ファイル名と用途は plus フォルダと同じです。

images フォルダ

php ソースで使用するボタンなどの gif ファイルが格納されています。

photos フォルダ

賃貸物件の間取りや、外観などの画像ファイルが格納されています。

arr フォルダ

賃貸物件の間取り図の画像ファイルを格納するフォルダです。

innor フォルダ

賃貸物件の内装写真の画像ファイルを格納するフォルダです。

map フォルダ

賃貸物件の地図の画像ファイルを格納するフォルダです。

out フォルダ

賃貸物件の外観写真の画像ファイルを格納するフォルダです。

css フォルダ

ブラウザでWebページを表示するときに使用するフォーマットを記述したカスケード・スタイル・シートを格納します。

次に、Oracle アプリケーションを PowerGres Plus 用に変更するための手順を紹介します。 なお、今回紹介した、移行後の PowerGres Plus のサンプルをそのまま使用できる手順も、「Oracle マイグレーション 第 4 回 番外編」に紹介してありますので、ご覧ください。

アプリケーション移行の概要

PHP を使ったアプリケーションは、PHP プログラム中の関数名を変更して、SQL コマンドを PowerGres Plus 用に手直しすることで、移行することができます。

アプリケーション移行の概要

図 3: アプリケーション移行の概要

PHP の移行

最初に、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 のマニュアルは、インストール媒体に含まれています。

SQL コマンドの移行

続いて、PHP 内で発行している SQL コマンドを移行します。 Oracle 固有の SQL コマンドを使っている場合は、それを PowerGres Plus で使用可能な SQL コマンドに変更します。 Oracle と PowerGres Plus の SQL コマンドの主な違いについては、「付録: Oracle と PowerGres Plus の変更点一覧」を用意しましたので、ご利用ください。

今回の Web アプリケーションで使用している SQL コマンドを調べた結果、以下の箇所を移行すれば良いことがわかりました。

変更点

それでは、順番に見ていきましょう。

Oracle の内部関数 row_number の対処 (inc_result.php)

row_number() という Oracle 内部関数を使って、between 述語により、取り出すレコードの開始位置と終了位置を指定しています。 PowerGres Plus は limit と offset を使うことで、同じことができます。

Oracle:
$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;
PowerGres Plus:
$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 コマンドはかなり簡単になりました。

Oracle の内部関数 REGEXP_LIKE の対処 (inc_gen_query.php)

REGEXP_LIKE という内部関数を使って正規表現による判定を行っています。 PowerGres Plus (PostgreSQL) では、similar to という演算子を使うことで同じことができます。

Oracle:
$temp = "REGEXP_LIKE ( ARRANGEMENT, '1(D)?K' )";
PowerGres Plus:
$temp = "ARRANGEMENT SIMILAR TO '1(D)?K' ";
日付を処理する関数の対処 (inc_gen_query.php)

Oracle の SYSDATE 関数を、PowerGres Plus (PostgreSQL) では、current_timestamp 関数を使うことで、同じことができます。 ただし、SYSDATE 関数と current_timestamp 関数では、返却値が異なるため、PowerGres Plus (PostgreSQL) では、「DAY TO SECOND」という記述も削除します。

Oracle:
$query_DaysPassed = "EXTRACT(DAY FROM (SYSDATE - pub_date) DAY TO SECOND )*24+EXTRACT(HOUR FROM (SYSDATE - pub_date) DAY TO SECOND ) 
PowerGres Plus:
$query_DaysPassed = "EXTRACT(DAY FROM (current_timestamp - pub_date))*24+EXTRACT(HOUR FROM (current_timestamp - pub_date)) 
Oracle の clob 型に対する対処 (housePic.php、inc_global.php、inc_showalltable.php)

設備のデータを処理するために、clob 型を使っています。 PowerGres Plus (PostgreSQL) では text 型を使います。 clob 型ではデータを参照するために、load() メソッドを使わなければなりませんが、text 型ではそのまま参照できます。

Oracle:
$equipment_rowdata['ENQUIPMENT'] =     htmlspecialchars($equipment_rowdata['ENQUIPMENT']->load());
PowerGres Plus:
$enquipment_rowdata['enquipment'] = htmlspecialchars($enquipment_rowdata['enquipment']);
アプリケーションの実行

これで、Web アプリケーションのプログラムの変更が終わりました。 あとは、Web アプリケーションを実行するための環境を PowerGres Plus 用に変更します。

今回の Web アプリケーションは、Apache と PHP を使っています。 Apache と PHP は次のバージョンを使います。

環境設定の変更

Apache の環境ファイルの変更

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 の再構築とインストール

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
Apache の再起動

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 と PowerGres Plus の変更点一覧

表 1: PHP で関数名の変更だけで対応可能な関数一覧
変更前 (oracle 用) 変更後 (plus 用)
oci_close pg_close
oci_fetch_array pg_fetch_array
oci_error() pg_last_error()

表 2: PHP で復帰値、パラメタの考慮、変更が必要な関数一覧
変更前 (oracle 用) 変更後 (plus 用)
oci_parse()
oci_execute() pg_query()
oci_free_statement() pg_free_result()
oci_fetch_all() pg_num_rows()
oci_connect() pg_connect()

表 3: SELECT 文の記述の対応例
項目 Oracle PowerGres Plus
列の別名 「AS」省略可 「AS」が必須
結果の部分取り出し ROWNUM
LINE BETWEEN
OFFSET
OFFSET 〜 LIMIT
アウタージョイン 拡張構文「(+)」 標準の記述形式
FROM 句副問合せ エイリアス必要無 エイリアス必須

SRA OSS Online Shop

製品・サービスに関するお問い合わせ
03-5979-2701

お問い合せ受付時間 月 - 金 10:00 - 17:00

メールフォームでのお問い合わせ

ページトップへ