目次


簡単にできる!OracleからDB2 9.7への移行ステップ

PL/SQLをDB2上で実行!

第3回

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: 簡単にできる!OracleからDB2 9.7への移行ステップ

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:簡単にできる!OracleからDB2 9.7への移行ステップ

このシリーズの続きに乞うご期待。

はじめに

前回の記事では、OracleからDB2へのオブジェクト移行、データ移行について実施しました。今回の記事では、Oracle上で稼動していたPL/SQLをDB2で実行する方法をご紹介します。DB2の基本操作については、参考資料「とりあえず触ってみようDB2」ハンズオンセミナーをご覧ください。

1. DB2でPL/SQLを実行するには?

PL/SQLは、Oracle社が開発したSQLのプログラミング言語です。DB2V9.7では、DB2が従来から提供しているSQL プロシージャー型言語 (SQL PL)に加えて、PL/SQL ステートメントを、DB2のインターフェースを使用してコンパイルおよび実行できます。

PL/SQLを実行するために特別な設定は必要ありません。前回の記事でも使用したOracle互換機能をONにしたデータベースであれば、PL/SQL ステートメントおよび言語要素のコンパイルと実行を可能にする互換性フィーチャーも設定されるため、PL/SQLを実行することが出来ます。

実行するインターフェースについては、DB2で従来から提供されているCLPと、新しく追加されたSQL*Plusと同様のインターフェースを持つCLPPlusのどちらからでもPL/SQLを実行することが可能です。当資料では、両方の実行方法を記載していますので、お試しください。

必要な前提

  • Oracle互換モードON(db2_compatibility_vector=ORA)で作成されたDBであること
  • PL/SQLで実行されるオブジェクトがDB2に正常に移行されていること

2. DB2 CLPPlusでPL/SQLを動かしてみよう

以下は、Oracle11gで動かしているPL/SQLの例になります。カーソルループを使い、EMP1表から、JOB列がCLERKとなっている従業員の名前を取得しています。

SQL> set serveroutput on;
SQL> declare
  2  val_ename emp1.ename%type;
  3  val_total emp1.sal%type;
  4  begin
  5     for cur1 in (select ename, sal + nvl(comm, 0) as total
  6             from emp1 where job = 'CLERK') loop
  7             val_ename:= cur1.ename;
  8             val_total:= cur1.total;
  9                     dbms_output.put_line('ename:'||val_ename||' total:'||val_total);
 10     end loop;
 11  end;
 12  /
ename:SMITH total:800
ename:ADAMS total:1100
ename:JAMES total:950
ename:MILLER total:1300

PL/SQL procedure successfully completed.

それでは、早速Oracleで動かしていたPL/SQLをDB2で実行してみましょう。

SQL*Plusと同様のインタフェースで実行できるCLPPlusを使用してみます。CLPPlusの起動コマンドは、SQL*Plusの起動コマンドとほぼ同じです。(詳細については、ここでは割愛いたしますので、参考資料をご覧ください。)
DB2ユーザーで以下のコマンドを実行します。このコマンドでCLPPlusの起動と、DBへの接続を実行します。

clpplus ユーザー名/パスワード@ホスト名/DB名

CLPPlus起動コマンドに「-nw」オプションをつけると、現在のWindowを引き継いで起動されます。

linux-7vkz:~ # su - db2inst1
db2inst1@linux-7vkz:~> clpplus db2inst1/db2inst1@linux-7vkz:50000/sample -nw
CLPPlus: Version 1.4
Copyright (c) 2009, 2011, IBM CORPORATION.  All rights reserved.


Database Connection Information :
---------------------------------
Hostname = linux-7vkz
Database server = DB2/LINUX  SQL09074
SQL authorization ID = db2inst1
Local database alias = SAMPLE
Port = 50000

CLPPlusを起動したら、PL/SQLを実行することができます。Oracleで使用していた先ほどのPL/SQLを実行してみましょう。

SQL> set serveroutput on;
SQL> declare
  2  val_ename emp1.ename%type;
  3  val_total emp1.sal%type;
  4  begin
  5  for cur1 in (select ename, sal + nvl(comm, 0) as total
  6  from emp1 where job = 'CLERK') loop
  7  val_ename:= cur1.ename;
  8  val_total:= cur1.total;
  9      dbms_output.put_line('ename:'||val_ename||' total:'||val_total);
 10  end loop;
 11  end;
 12  /
ename:SMITH total:800
ename:ADAMS total:1100
ename:JAMES total:950
ename:MILLER total:1300

DB250000I: The command completed successfully.

Oracleと同じ結果を正常に取得できていることが分かります。PL/SQLの修正をすることなく、そのままDB2でも動くことが確認できました。ここでは対話式で実行していますが、SQL*Plusと同様に、ファイルから読み込んで実行をすることもできます。
なお、この結果からPL/SQLだけではなく、OracleのDBMS_OUTPUTビルトインパッケージも、DB2で互換性があることが確認できます。

3. DB2 CLPでPL/SQLを動かしてみよう

今までDB2を使用したことがある方は、CLPの方が使いやすいかもしれません。従来のDB2 CLPでのPL/SQLの実行方法をご紹介します。

CLPでは、スラッシュ文字(/)がPL/SQLのステートメント終了文字として認識されるように、SET SQLCOMPAT PLSQLコマンドを実行する必要があります。CLPPlusはデフォルトでPL/SQLの区切り文字(/)を認識します。

CLPで実行する場合には、以下のように太字を加えてください。

set serveroutput on;
set sqlcompat plsql;
declare
	val_ename emp1.ename%type;
	val_total emp1.sal%type;
begin
	for cur1 in (select ename, sal + nvl(comm, 0) as total
		from emp1 where job = 'CLERK') loop
		val_ename:= cur1.ename;
		val_total:= cur1.total;
    		dbms_output.put_line('ename:'||val_ename||' total:'||val_total);
	end loop;
end;
/
set sqlcompat db2;
quit;

CLPPLusと同様に、対話式で実行することも出来ますが、今度はファイルから読み込んで実行してみましょう。
上記のPL/SQLを、ここではselect.sqlという名前のファイルとして保存します。
DB2ユーザーでDBへの接続を行い、ファイルを実行してください。以下の実行コマンドにあるように、「-tvf」オプションを指定すると、指定したファイル(select.sql)が読込まれ実行されます。CLPPlusでの実行結果と同じ結果が得られることを確認してください。

db2inst1@linux-7vkz: > db2 connect to sample

   Database Connection Information

 Database server        = DB2/LINUX 9.7.4
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPLE

db2inst1@linux-7vkz: > db2 -tvf select.sql

<結果省略>

おわりに

PL/SQLの移行方法の概要は以上になります。
実際にPL/SQLを移行される場合には、多くはそのまま移行することができるかと思いますが、書き換えが必要になる箇所が出てくる場合があります。DB2では、PL/SQLのデバッグができるツール(IBM Data Studio)も提供しているのでご利用ください。

次章では、OracleからDB2へのアプリケーション移行として、ADO.NETを取り上げます。
もっと詳細が知りたいという読者の皆さんに以下に参考情報のリンクを掲載いたしますので、合わせてご参照ください。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management
ArticleID=946651
ArticleTitle=簡単にできる!OracleからDB2 9.7への移行ステップ: PL/SQLをDB2上で実行!
publish-date=02292012