Oracle
Oracle
Oracle
Oracle
からの
からの
からの
からのアプリケーシ
アプリケーシ
アプリケーシ
アプリケーシ
ョン
ョン
ョン
ョンの
の
の
の移行
移行
移行
移行
ハンズオン
ハンズオン
ハンズオン
ハンズオン
(
(
(
(Lab6
Lab6
Lab6
Lab6)
)
)
)
I
日本 日本 日本
Contents
CONTENTS ...2 1. 1.1. 1. はじめにはじめに ... 3はじめにはじめに 2. 2.2. 2. 内容内容内容内容...3 3. 3.3. 3. SELECTSELECTSELECTSELECT文文を文文ををを実行実行する実行実行するするするJAVAJAVAJAVAJAVAプログラムプログラムプログラムプログラム ... 33.1 ソースコードの確認...3 3.2 ソースコードの編集...4 3.3 プログラムのコンパイル...5 3.4 プログラムの実行...6 4. 4.4. 4. ストアド・ストアドストアドストアド・・・ファンクションファンクションファンクションをファンクションををを呼呼呼呼びび出びび出出出すすすすJAVAJAVAJAVAJAVAプログラムプログラムプログラムプログラム... 7
4.1 ソースコードの確認...7
4.2 ソースコードの編集...8
4.3 プログラムのコンパイル...10
1
1
1
1.
.
.
.
はじめに
はじめに
はじめに
はじめに
このハンズオンでは、Oracle 用に記述された Java プログラムをDB2 で稼動するように書き換 えを行い、実際に稼動することを確認します。2
2
2
2.
.
.
.
内容
内容
内容
内容
このハンズオンでは以下の内容を実施します。 SELECT 文を実行する Java プログラム ストアド・ファンクションを呼び出す Java プログラム3
3
3
3.
.
.
.
SELECT
SELECT
SELECT
SELECT
文
文
文
文を
を実行
を
を
実行
実行する
実行
する
する
する
Java
Java
Java
Java
プログラム
プログラム
プログラム
プログラム
この章では、Oracle 用に書かれたSELECT文を実行する Javaプログラムを DB2用に編集し、
実行できることを確認します。
3
3
3
3.
.
.
.1
1
1
1
ソースコードの
ソースコード
ソースコード
ソースコード
の
の
の確認
確認
確認
確認
_ソースコードの確認 最初に/workshop/lab6/source ディレクトリに移動し、orasampl1.java ファイルの内容を確認し ます。 db2inst1 ユーザーで以下のコマンドを実行します。 コマンド cd /workshop/lab6/source cat /orasampl1.java 実行例 db2inst1@db2V97onSLES10:~> cd /workshop/lab6/sourcedb2inst1@db2V97onSLES10:/workshop/lab6/source> cat orasampl1.java import java.sql.*;
class orasampl1 {
public static void main (String args [])
以下のようなソースコードが確認できます。 orasampl1.java このプログラムは、Oracle に接続してDEPARTMENTS 表を選択して、 DEPT_CODE,DEPT_NAME の一覧を出力するプログラムです。
3
3
3
3.
.
.
.2
2
2
2
ソースコードの
ソースコード
ソースコード
ソースコード
の
の
の編集
編集
編集
編集
_ソースコードの編集 viで orasampl1.java の以下の三箇所をDB2 で実行できるように書き直します。(時間のない方 やvi の操作に不慣れな方は、/workshop/lab6/source_modified/ディレクトリに修正済みのソー スがありますのでこちらを使用してください。) 変更箇所 1.ドライバーのクラス名の変更:7 行目更新前:Class.forName ("oracle.jdbc.driver.OracleDriveroracle.jdbc.driver.OracleDriveroracle.jdbc.driver.OracleDriver"); oracle.jdbc.driver.OracleDriver 更新後:Class.forName ("com.ibm.db2.jcc.DB2Drivercom.ibm.db2.jcc.DB2Drivercom.ibm.db2.jcc.DB2Driver"); com.ibm.db2.jcc.DB2Driver 2.URL、ユーザーID、パスワードの変更:8 行目
更新前:Connection con = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:ora11gjdbc:oracle:thin:@localhost:1521:ora11gjdbc:oracle:thin:@localhost:1521:ora11gjdbc:oracle:thin:@localhost:1521:ora11g","salessalessales", "passwordsales passwordpasswordpassword"); 更新後:Connection con = DriverManager.getConnection
("jdbc:db2://localhost:60000/labdbjdbc:db2://localhost:60000/labdbjdbc:db2://localhost:60000/labdbjdbc:db2://localhost:60000/labdb","db2inst1db2inst1db2inst1db2inst1","db2inst1db2inst1db2inst1"); db2inst1 3.スキーマ名の指定:10 行目
更新前:ResultSet rs = stmt.executeQuery ("select dept_code,dept_name from departments");
更新後:ResultSet rs = stmt.executeQuery ("select dept_code,dept_name from sales.
sales.sales.
sales.departments");
import java.sql.*; class orasampl1 {
public static void main (String args []) throws Exception
{
Class.forName ("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:ora11g","sales", "password"); Statement stmt = con.createStatement ();
ResultSet rs = stmt.executeQuery ("select dept_code,dept_name from departments"); while (rs.next ())
System.out.println (rs.getString (1) + " " + rs.getString(2)); }
以下は修正例です。(修正例では、変更前のものをコメントで残していますが直接書き換えて 頂いても構いません。) orasampl1.java修正例
3
3
3
3.
.
.
.3
3
3
3
プログラムの
プログラム
プログラム
プログラム
の
の
のコンパイル
コンパイル
コンパイル
コンパイル
_プログラムのコンパイル 書き換えたプログラムをコンパイルします。 変更したソースコードがあるディレクトリで以下のコマンドを実行します。 コマンド javac orasampl1.java ls -ltr 実行例 コンパイル後、orasampl1.class ファイルが作成されていることが確認できます。 import java.sql.*; class orasampl1 {public static void main (String args []) throws Exception
{
// Class.forName ("oracle.jdbc.driver.OracleDriver"); Class.forName ("com.ibm.db2.jcc.DB2Driver");
// Connection con = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:ora11g","sales", "password"); Connection con = DriverManager.getConnection ("jdbc:db2://localhost:60000/labdb","db2inst1","db2inst1"); Statement stmt = con.createStatement ();
// ResultSet rs = stmt.executeQuery ("select dept_code,dept_name from departments"); ResultSet rs = stmt.executeQuery ("select dept_code,dept_name from sales.departments"); while (rs.next ())
System.out.println (rs.getString (1) + " " + rs.getString(2)); }
}
db2inst1@db2V97onSLES10:/workshop/lab6/source> javac orasampl1.java db2inst1@db2V97onSLES10:/workshop/lab6/source> ls -ltr
合計 12
-rw-r--r-- 1 db2inst1 db2user 627 2009-08-30 14:32 orasampl2.java -rw-r--r-- 1 db2inst1 db2user 758 2009-08-30 15:53 orasampl1.java -rw-r--r-- 1 db2inst1 db2user 1365 2009-08-30 17:31 orasampl1.class
3
3
3
3.
.
.
.4
4
4
4
プログラムの
プログラム
プログラム
プログラム
の
の
の実行
実行
実行
実行
_プログラムの実行 orasampl1.class ファイルがあるディレクトリで以下のコマンドを実行し、プログラムを実行します。 コマンド java orasampl1 実行例 DEPARTMENTS 表の8 行のデータが出力されれば、正しく実行できています。db2inst1@db2V97onSLES10:/workshop/lab6/source> java orasampl1 A00 ADMINISTRATION SYSTEMS
B01 INFORMATION CENTER C01 MANUFACTURING SYSTEMS D11 OPERATIONS
D21 PLANNING
E01 SOFTWARE SUPPORT
E11 SPIFFY COMPUTER SERVICE DIV. E21 SUPPORT SERVICES
4
4
4
4.
.
.
.
ストアド
ストアド
ストアド
ストアド・
・ファンクション
・
・
ファンクション
ファンクションを
ファンクション
を
を呼
を
呼
呼
呼び
び出
び
び
出
出す
出
す
す
す
Java
Java
Java
Java
プロ
プロ
プロ
プログラム
グラム
グラム
グラム
この章では、アウト・パラメーターを持つストアド・ファンクションを呼び出す Javaプログラムを DB2 用に書き換えます。アウト・パラメーターを持つストアド・ファンクションは、DB2 9.7ではサ ポートされていなため、Lab5 でストアド・プロシージャーに書き換えたものをCallするように書き 換えます。
4
4
4
4.
.
.
.1
1
1
1
ソースコードの
ソースコード
ソースコード
ソースコード
の
の
の確認
確認
確認
確認
_ソースコードの確認 /workshop/lab6/source ディレクトリに移動し、orasampl2.javaファイルの内容を確認します。 db2inst1 ユーザーで以下のコマンドを実行します。 コマンド cd /workshop/lab6/source cat /orasampl2.java 実行例 以下のようなソースコードが確認できます。 orasampl2.java db2inst1@db2V97onSLES10:~> cd /workshop/lab6/sourcedb2inst1@db2V97onSLES10:/workshop/lab6/source> cat orasampl2.java import java.sql.*;
class orasampl2 {
public static void main (String args []) ・・・省略・・・
import java.sql.*; class orasampl2 {
public static void main (String args []) throws Exception
{
Class.forName ("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:ora11g","sales", "password"); String SpCall = "{? = call count_projects(1,?)}";
CallableStatement stmt = con.prepareCall(SpCall); stmt.registerOutParameter(1, Types.INTEGER); stmt.registerOutParameter(2, Types.INTEGER); stmt.execute();
System.out.println("Account ID:"+ stmt.getString(2)); System.out.println("Projects :"+ stmt.getString(1)); }
このプログラムは、Oracle に接続し、アウト・パラメーターを持つストアド・ファンクション COUNT_PROJECTS を呼び出し、ストアド・ファンクションから返された値を出力するプログラム です。
4
4
4
4.
.
.
.2
2
2
2
ソースコードの
ソースコード
ソースコード
ソースコード
の
の
の編集
編集
編集
編集
_ストアド・プロシージャーの確認 ソースコードの編集を行う前にLABDB 上にアウト・パラメーターを持つストアド・ファンクション の代わりに呼び出すストアド・プロシージャーが存在していることを確認します。 以下のコマンドを実行し、COUNT_PROJECTS ストアド・プロシージャーのDDL を確認します。 コマンドdb2look -d labdb -e | grep -A 50 \"COUNT_PROJECTS\" 実行例
DB2 9.7 では、アウト・パラメーターをもつストアド・ファンクションをサポートしていないため、スト アド・ファンクションの戻り値として受け取る値を、ストアド・プロシージャーのアウト・パラメータ ー(out_return)として受け取るように変更しています。
db2inst1@db2V97onSLES10:~> db2look -d labdb -e | grep -A 50 \"COUNT_PROJECTS\" -- ユーザー ID が指定されていません。db2look は環境変数 USER の使用を試行します -- USER は以下のとおりです: DB2INST1
-- 表の DDL の作成
CREATE PROCEDURE "COUNT_PROJECTS" (p_empID IN employees.emp_ID%TYPE, o_acct_id OUT employees.acct_id%TYPE, out_return OUT NUMBERout_return OUT NUMBERout_return OUT NUMBERout_return OUT NUMBER)
AS -- /*
-- ||--- -- || DESCRIPTION: Function that counts the project based on the employeed id and also
-- || returns information on total projects of the account to which employee id belongs -- ||
_ソースコードの編集 viで orasampl2.java の以下の5箇所を DB2 用に書き直します。(時間のない方やviの操作に 不慣れな方は、/workshop/lab6/source_modified/ディレクトリに修正済みのソースがあります のでこちらを使用してください。) 変更箇所 1.ドライバーのクラス名の変更:7 行目
更新前:Class.forName ("oracle.jdbc.driver.OracleDriveroracle.jdbc.driver.OracleDriveroracle.jdbc.driver.OracleDriver"); oracle.jdbc.driver.OracleDriver 更新後:Class.forName ("com.ibm.db2.jcc.DB2Drivercom.ibm.db2.jcc.DB2Drivercom.ibm.db2.jcc.DB2Driver"); com.ibm.db2.jcc.DB2Driver 2.URL、ユーザーID、パスワードの変更:8 行目
更新前:Connection con = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:orajdbc:oracle:thin:@localhost:1521:orajdbc:oracle:thin:@localhost:1521:orajdbc:oracle:thin:@localhost:1521:ora11g11g11g","sales11g salessales", "passwordsales passwordpasswordpassword"); 更新後:Connection con = DriverManager.getConnection
("jdbc:db2://localhost:60000/labdbjdbc:db2://localhost:60000/labdbjdbc:db2://localhost:60000/labdbjdbc:db2://localhost:60000/labdb","db2inst1db2inst1db2inst1db2inst1","db2inst1db2inst1db2inst1"); db2inst1 3.スキーマ名の指定と戻り値をアウト・パラメータに変更:9 行目
更新前:String SpCall = "{? = call count_projects(1,?)? = call count_projects(1,?)? = call count_projects(1,?)? = call count_projects(1,?)}"; 更新後:String SpCall = "{call salescall salescall salescall sales.count_projects(1,?,?).count_projects(1,?,?).count_projects(1,?,?).count_projects(1,?,?)}"; 4.取得するパラメーターを変更:14 行目
更新前:System.out.println("Account ID:"+ stmt.getString(2222)); 更新後:System.out.println("Account ID:"+ stmt.getString(1111)); 5.取得するパラメーターを変更:15 行目 更新前:System.out.println("Projects :"+ stmt.getString(111)); 1 更新後:System.out.println("Projects :"+ stmt.getString(222)); 2 以下は修正例です。(修正例では、変更前のものをコメントで残していますが直接書き換えて 頂いても構いません。) orasampl2.java修正例 import java.sql.*; class orasampl2 {
public static void main (String args []) throws Exception
{
// Class.forName ("oracle.jdbc.driver.OracleDriver"); Class.forName ("com.ibm.db2.jcc.DB2Driver");Class.forName ("com.ibm.db2.jcc.DB2Driver"); Class.forName ("com.ibm.db2.jcc.DB2Driver");Class.forName ("com.ibm.db2.jcc.DB2Driver");
// Connection con = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:ora11g","sales", "password"); Connection con = DriverManager.getConnection ("jdbc:dConnection con = DriverManager.getConnection ("jdbc:db2://localhost:60000/labdb","db2inst1", "db2inst1");Connection con = DriverManager.getConnection ("jdbc:dConnection con = DriverManager.getConnection ("jdbc:db2://localhost:60000/labdb","db2inst1", "db2inst1");b2://localhost:60000/labdb","db2inst1", "db2inst1"); b2://localhost:60000/labdb","db2inst1", "db2inst1");
// String SpCall = "{? = call count_projects(1,?)}"; String SpCall = "{call sales.count_projects(1,?,?)}";String SpCall = "{call sales.count_projects(1,?,?)}"; String SpCall = "{call sales.count_projects(1,?,?)}";String SpCall = "{call sales.count_projects(1,?,?)}";
CallableStatement stmt = con.prepareCall(SpCall); stmt.registerOutParameter(1, Types.INTEGER); stmt.registerOutParameter(2, Types.INTEGER); stmt.execute();
// System.out.println("Account ID:"+ stmt.getString(2)); System.out.printlnSystem.out.println("Account ID:"+ stmt.getString(System.out.printlnSystem.out.println("Account ID:"+ stmt.getString(("Account ID:"+ stmt.getString(("Account ID:"+ stmt.getString(1111));));));));
// System.out.println("Projects :"+ stmt.getString(1)); System.out.printlnSystem.out.printlnSystem.out.println("Projects :"+ stmt.getString(System.out.println("Projects :"+ stmt.getString(("Projects :"+ stmt.getString(("Projects :"+ stmt.getString(2222));));));));
} }
4
4
4
4.
.
.
.3
3
3
3
プログラムの
プログラム
プログラム
プログラム
の
の
のコンパイル
コンパイル
コンパイル
コンパイル
_プログラムのコンパイル 書き換えたプログラムをコンパイルします。 変更したソースコードがあるディレクトリで以下のコマンドを実行します。 コマンド javac orasampl2.java ls -ltr 実行例 コンパイル後、orasampl2.class ファイルが作成されていることが確認できます。4
4
4
4.
.
.
.4
4
4
4
プログラムの
プログラム
プログラム
プログラム
の
の
の実行
実行
実行
実行
_プログラムの実行 orasampl2.class ファイルがあるディレクトリで以下のコマンドを実行し、プログラムを実行します。 コマンド java orasampl2 実行例Account ID:1と Projects:2が出力されれば、正しく実行できています。
以上でアプリケーションの移行ハンズオンは終了です。
db2inst1@db2V97onSLES10:/workshop/lab6/source> javac orasampl2.java db2inst1@db2V97onSLES10:/workshop/lab6/source> ls -ltr
合計 16
-rw-r--r-- 1 db2inst1 db2user 758 2009-08-30 15:53 orasampl1.java -rw-r--r-- 1 db2inst1 db2user 1365 2009-08-30 17:31 orasampl1.class -rw-r--r-- 1 db2inst1 db2user 960 2009-08-30 19:37 orasampl2.java -rw-r--r-- 1 db2inst1 db2user 1352 2009-08-30 19:37 orasampl2.class
db2inst1@db2V97onSLES10:/workshop/lab6/source> java orasampl2 Account ID:1
© Copyright IBM Corporation 2009 All Rights Reserved.