I Oracle からのアプリケーションの移行ハンズオン (Lab6 Lab6) 日本アイアイ ビービー エムエム株式会社
Contents CONTENTS...2 1. はじめに...3 2. 内容...3 3. SELECT 文を実行実行する JAVA プログラム...3 3.1 ソースコードの確認...3 3.2 ソースコードの編集...4 3.3 プログラムのコンパイル...5 3.4 プログラムの実行...6 4. ストアド ファンクションファンクションを呼び出す JAVA プログラム...7 4.1 ソースコードの確認...7 4.2 ソースコードの編集...8 4.3 プログラムのコンパイル...10 4.4 プログラムの実行...10 2
1. はじめに このハンズオンでは Oracle 用に記述された Java プログラムを DB2 で稼動するように書き換えを行い 実際に稼動することを確認します 2. 内容 このハンズオンでは以下の内容を実施します SELECT 文を実行する Java プログラム ストアド ファンクションを呼び出す Java プログラム 3. SELECT 文を実行実行する Java プログラム この章では Oracle 用に書かれた SELECT 文を実行する Java プログラムを DB2 用に編集し 実行できることを確認します 3.1 ソースコードの確認 _ ソースコードの確認最初に /workshop/lab6/source ディレクトリに移動し orasampl1.java ファイルの内容を確認します db2inst1 ユーザーで以下のを実行します cd /workshop/lab6/source cat /orasampl1.java db2inst1@db2v97onsles10:~> cd /workshop/lab6/source db2inst1@db2v97onsles10:/workshop/lab6/source> cat orasampl1.java class orasampl1 { 省略 3
以下のようなソースコードが確認できます orasampl1.java class orasampl1 { 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)); このプログラムは Oracle に接続して DEPARTMENTS 表を選択して DEPT_CODE,DEPT_NAME の一覧を出力するプログラムです 3.2 ソースコードの編集 _ ソースコードの編集 vi で orasampl1.java の以下の三箇所を DB2 で実行できるように書き直します ( 時間のない方や vi の操作に不慣れな方は /workshop/lab6/source_modified/ ディレクトリに修正済みのソースがありますのでこちらを使用してください ) 変更箇所 1. ドライバーのクラス名の変更 :7 行目更新前 :Class.forName ("oracle.jdbc.driver.oracledriver oracle.jdbc.driver.oracledriver"); 更新後 :Class.forName ("com.ibm.db2.jcc.db2driver com.ibm.db2.jcc.db2driver"); 2.URL ユーザー ID パスワードの変更:8 行目更新前 :Connection con = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:ora11g jdbc:oracle:thin:@localhost:1521:ora11g","sales sales", "password password"); 更新後 :Connection con = DriverManager.getConnection ("jdbc:db2://localhost:60000/labdb jdbc:db2://localhost:60000/labdb","db2inst1 db2inst1","db2inst1 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.departments"); 4
以下は修正例です ( 修正例では 変更前のものをコメントで残していますが直接書き換えて頂いても構いません ) orasampl1.java 修正例 class orasampl1 { 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)); 3.3 プログラムのコンパイル _ プログラムのコンパイル書き換えたプログラムをコンパイルします 変更したソースコードがあるディレクトリで以下のを実行します javac orasampl1.java ls -ltr 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 コンパイル後 orasampl1.class ファイルが作成されていることが確認できます 5
3.4 プログラムの実行 _ プログラムの実行 orasampl1.class ファイルがあるディレクトリで以下のを実行し プログラムを実行します java orasampl1 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 DEPARTMENTS 表の 8 行のデータが出力されれば 正しく実行できています 6
4. ストアド ファンクションファンクションを呼び出す Java プログラム この章では アウト パラメーターを持つストアド ファンクションを呼び出す Java プログラムを DB2 用に書き換えます アウト パラメーターを持つストアド ファンクションは DB2 9.7 ではサポートされていなため Lab5 でストアド プロシージャーに書き換えたものを Call するように書き換えます 4.1 ソースコードの確認 _ ソースコードの確認 /workshop/lab6/source ディレクトリに移動し orasampl2.java ファイルの内容を確認します db2inst1 ユーザーで以下のを実行します cd /workshop/lab6/source cat /orasampl2.java db2inst1@db2v97onsles10:~> cd /workshop/lab6/source db2inst1@db2v97onsles10:/workshop/lab6/source> cat orasampl2.java class orasampl2 { 省略 以下のようなソースコードが確認できます orasampl2.java class orasampl2 { 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)); 7
このプログラムは Oracle に接続し アウト パラメーターを持つストアド ファンクション COUNT_PROJECTS を呼び出し ストアド ファンクションから返された値を出力するプログラムです 4.2 ソースコードの編集 _ ストアド プロシージャーの確認ソースコードの編集を行う前に LABDB 上にアウト パラメーターを持つストアド ファンクションの代わりに呼び出すストアド プロシージャーが存在していることを確認します 以下のを実行し COUNT_PROJECTS ストアド プロシージャーの DDL を確認します db2look -d labdb -e grep -A 50 \"COUNT_PROJECTS\" 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 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 -- 省略 DB2 9.7 では アウト パラメーターをもつストアド ファンクションをサポートしていないため ストアド ファンクションの戻り値として受け取る値を ストアド プロシージャーのアウト パラメーター (out_return) として受け取るように変更しています 8
_ ソースコードの編集 vi で orasampl2.java の以下の 5 箇所を DB2 用に書き直します ( 時間のない方や vi の操作に不慣れな方は /workshop/lab6/source_modified/ ディレクトリに修正済みのソースがありますのでこちらを使用してください ) 変更箇所 1. ドライバーのクラス名の変更 :7 行目更新前 :Class.forName ("oracle.jdbc.driver.oracledriver oracle.jdbc.driver.oracledriver"); 更新後 :Class.forName ("com.ibm.db2.jcc.db2driver com.ibm.db2.jcc.db2driver"); 2.URL ユーザー ID パスワードの変更:8 行目更新前 :Connection con = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:ora jdbc:oracle:thin:@localhost:1521:ora11g 11g","sales sales", "password password"); 更新後 :Connection con = DriverManager.getConnection ("jdbc:db2://localhost:60000/labdb jdbc:db2://localhost:60000/labdb","db2inst1 db2inst1","db2inst1 db2inst1"); 3. スキーマ名の指定と戻り値をアウト パラメータに変更 :9 行目更新前 :String SpCall = "{?? = call count_projects(1,?)"; 更新後 :String SpCall = "{call sales.count_projects(1,?,?).count_projects(1,?,?)"; 4. 取得するパラメーターを変更 :14 行目更新前 :System.out.println("Account ID:"+ stmt.getstring(2)); 更新後 :System.out.println("Account ID:"+ stmt.getstring(1)); 5. 取得するパラメーターを変更 :15 行目更新前 :System.out.println("Projects :"+ stmt.getstring(1)); 更新後 :System.out.println("Projects :"+ stmt.getstring(2)); 以下は修正例です ( 修正例では 変更前のものをコメントで残していますが直接書き換えて頂いても構いません ) orasampl2.java 修正例 class orasampl2 { 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", b2://localhost:60000/labdb","db2inst1", "db2inst1"); // String SpCall = "{? = call 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.println("Account ID:"+ stmt.getstring(1)); // System.out.println("Projects :"+ stmt.getstring(1)); System.out.println("Projects :"+ stmt.getstring(2)); 9
4.3 プログラムのコンパイル _ プログラムのコンパイル書き換えたプログラムをコンパイルします 変更したソースコードがあるディレクトリで以下のを実行します javac orasampl2.java ls -ltr 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 コンパイル後 orasampl2.class ファイルが作成されていることが確認できます 4.4 プログラムの実行 _ プログラムの実行 orasampl2.class ファイルがあるディレクトリで以下のを実行し プログラムを実行します java orasampl2 db2inst1@db2v97onsles10:/workshop/lab6/source> java orasampl2 Account ID:1 Projects :2 Account ID:1 と Projects:2 が出力されれば 正しく実行できています 以上でアプリケーションの移行ハンズオンは終了です お疲れ様でした 10
Copyright IBM Corporation 2009 All Rights Reserved. 11