Comments
Description
Transcript
Oracle 第5章 からのアプリケーション移行
<2011年5月> 第5章 Oracleからのアプリケーション移行 本書に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、暗黙的にしろ、なんらの保証もなしに配布されるものです。 この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用する環境に統合する 使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べられていますが、他のところで同じまたは同 様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使用先は、自己の責任において行う必要があります。 © Copyright IBM Japan Co., Ltd. 2009 目次 • Java (JDBC) • 組み込みSQL (Oracle Pro*Cと とDB2 C 組み込みSQL) • PHP • ODBC • .NET • Ruby on rails 2 © 2009 IBM Corporation DB2のアプリケーション・インターフェース アプリケーション インターフェース 言語 コメント 組み込みSQL C/C++ FORTRAN COBOL Java (SQLJ) Traditionalなアプリケーションインターフェース アプリケーションコードに埋め込みSQLステートメントを記述し、プリコンパイラでバインドファイ ルに分離 パフォーマンスが重要なアプリケーションに向いている 管理API C/C++ DB2サーバーの管理を行うアプリケーションで使用される Perl Perl DBIモジュールとDBD::DB2が必要 PHP PHP DB2をアクセスするためにIbm_db2とpdo_ibmのPHPエクステンションを提供 Ruby on Rails Ruby IBM_DB Ruby driverとRails adapterを提供 JDBC Java Javaのための共通インターフェース JDBC3.0とJDBC4.0に準拠したJDBCドライバーが使用できる PureQuery Java Javaのための新しいインターフェース 動的SQLと静的SQLを切り替えて使用できる CLI/ODBC C/C++ X/Open標準のインターフェース ADO (OLE DB) VB 以下の2つのインターフェースから接続できる • IBM OLE DB Data Provider • IBM ODBC Driver ADO.NET VB.NET C# ADO.NETのためのインターフェース IBM DB2 .NET DataProvider使用してDB2にアクセス 3 © 2009 IBM Corporation ブランク・ ブランク・ページ 4 © 2009 IBM Corporation Javaからの接続方法 • • • JDBC • Java Programからの接続する際の主な方法 • 動的SQL SQLJ DB2 only • 静的SQLを使用したアクセス • パフォーマンス、セキュリティ面での優位性 PureQuery • 同じコードで静的SQLと動的SQLをスイッチできる • JavaとSQLのシームレスな統合 アプリケーション・サーバー JVM Java API Java program 5 Java Driver DriverManager DataSource Driver Connection Statement... DRDA DB2 db2agent db2agent db2agent db2agent db2agent db2agent © 2009 IBM Corporation JDBCドライバータイプ • JDBCドライバー ドライバーは ドライバーは、実装の 実装の方式によって 方式によって4 によって4つのタイプ つのタイプに タイプに分類される 分類される • JDBC Driverの のタイプ • Type 1 (JDBC-ODBC bridge) • ODBC経由でのアクセス • パフォーマンスがよくない • Type 2 (Native API partly) • Java Native Interface (JNI)を使用してベンダーのネイティブAPIを呼び出す • アプリケーションとDBMSが同じ筐体にある場合にパフォーマンスが優れている • ベンダーのライブラリー(例:DB2クライアント)の導入が必要 • Type 3 (Net-protocol pure java) • Pure Javaドライバーからnet-protocolでデータベースサーバー上のリスナーにアクセス • リスナーが外部のレイヤーであるためオーバーヘッドがある • 現在はDB2とOracleともにType3ドライバーはサポートしていない • Type 4 (Native-protocol pure Java) • Pure Javaドライバーからベンダーのプロトコル(例:DRDA)で直接DBMSへアクセス • 変換やミドルウェアレイヤーがないためパフォーマンスがよい 6 © 2009 IBM Corporation DB2が提供するJDBCドライバー • JDBCドライバー ドライバーは ファイルとして ドライバーはjarファイル ファイルとして提供 として提供 • 1つのファイルにType2とType4のドライバーのコードを含んでいる • Type4はPure Javaドライバーであるため、DB2クライアントは不要 • ドライバータイプは または接続 の指定によって ドライバータイプは、ドライバープロパティの ドライバープロパティの"driverType"または または接続URLの 接続 指定によって行 によって行 える JDBCアプリケーション SQLJアプリケーション JDBC API (java.sql package) SQLJ ランタイム IBM DB2 Driver for JDBC and SQLJ Type2 APP driver Java code for type 2 Java code for4type 【タイプ4 】 4 タイプ Common code DB2 CLI DB2クライアント JNI DB2クライアント DRDAプロトコル DRDAプロトコル DRDAプロトコル DB2 DB2 JDBC Type 2 Driver (Legacy) 7 IBM Data Server Driver for JDBC and SQLJ (Universal) DB2 JDBC Type2 Driverは 非推奨 © 2009 IBM Corporation ドライバーの選択 • • リモートアクセスの でローカルアクセスの リモートアクセスのケースでは ケースでは、 では、Type4 Universal Driverで ローカルアクセスの場合には 場合には Type2 Universal Driver • Type 2ドライバーはローカルアクセスのパフォーマンスがよい。IPC (Inter-process communication)経由でのアクセスになるため • Type 4ドライバーはリモートアクセスのパフォーマンスがよい。余計なレイヤーを経由せず 直接データベースにアクセスするため DB2 JDBC Type 2 Driver (Legacy)は 非推奨の 機能であるため であるため、 使用しないようにする は非推奨 の機能 であるため 、使用 しないようにする • Legacy driver は、 universal driverと比べ10-30%パフォーマンスが悪くなる場合もある Application Server Data Source JDBC Driver Type 2 DB2 Client Catalog DB2 UDB [target] Application Server Data Source 8 JDBC Driver Type 4 DB2 UDB [target] © 2009 IBM Corporation 環境の準備 • Type4接続の準備 • アプリケーションのCLASSPATHにDB2のJDBC ドライバー(JAR files) を加える • db2jcc.jar • DB2 for z/OSまたはDB2 for iSeriesをアクセスのためには、ライセンス情報を持つjar ファイルも追加する • db2jcc_license_cisuz.jar • Type2接続の準備 • DB2クライアントを使用するために以下のうちの1つのパッケージを導入する必要がある • IBM Data Server Runtime Client • IBM Data Server Client • IBM DB2 Data Server • これらのパッケージにはIBM DB2 driver for JDBC and SQLJが含まれている • アプリケーションのCLASSPATHにDB2のJDBCドライバー(JAR files)を加える • db2jcc.jar • db2jcc.jarの代わりにJDBC4.0をサポートしているdb2jcc4.jarを使用することも出来る 9 © 2009 IBM Corporation Javaプログラムの移行 • Javaプログラム プログラムを プログラムを移行するための 移行するための一般的 するための一般的な 一般的なタスク • 標準のAPI: Javaコードへの変更は必要ない • 接続ストリングの変更 • DB2 JDBC driverのロード • CLASSPATHにDB2のJDBC Driverファイルを追加 • Javaプログラムに入っているSQLの変更 • Javaコード コードへの コードへの主 への主な変更点 • 接続ストリング • JDBCドライバーの宣言 • ストアドプロシージャーから返される結果セット • カーソルタイプを返すファンクション 10 © 2009 IBM Corporation 接続ストリング • Connectionオブジェクト オブジェクト取得 メソッドを オブジェクト取得のために 取得のためにgetConnectionメソッド のために メソッドを使用する 使用する • getConnectionメソッドはJavaで標準化されているAPIであるためOracleで Connectionオブジェクトを取得する際にも同じ • getConnection(String url) • getConnection(String url, Properties info) • getConnection(String url, String user, String password) • URLの の指定では で独自の 指定では各 では各DBMSで 独自の接続ストリング 接続ストリングを ストリングを必要とする 必要とする • DB2 Type 2接続 • 例 String url = "jdbc:db2:labdb:user=db2inst1;password=password;"; • DB2 Type 4接続 • 例 String url = "jdbc:db2://localhost:50000/labdb" 11 © 2009 IBM Corporation JDBCドライバーの宣言 (1) • Oracleの のJDBC接続 接続の 接続の例: • Oracle driverのimport • ドライバーマネージャーへの登録 • ユーザーID、パスワード、データベース名を指定して接続 import java.sql.*; import java.io.*; import oracle.jdbc.driver.*; class rsetClient { public static void main (String args []) throws SQLException { // Load the driver DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); // Connect to the database Connection conn = DriverManager.getConnection ("jdbc:oracle:oci8:@oracle","uid","pwd"); // ... } } 12 © 2009 IBM Corporation JDBC driver宣言(2) • DB2の のJDBCの の接続の 接続の例 • JDBCドライバーのimportは不要 • クラスローダーによるJDBCドライバーのロード • ユーザーID、パスワード、データベース名を指定して接続 import java.sql.*; class rsetClient { public static void main (String args []) throws SQLException { // Load DB2 JDBC application driver try { Class.forName("com.ibm.db2.jcc.DB2Driver"); } catch (Exception e) { e.printStackTrace(); } // Connect to the database by type 2 driver String url = "jdbc:db2://hostname:50000/dbname"; Connection conn = DriverManager.getConnection(url, "uid", "pwd"); // ... } } 13 © 2009 IBM Corporation ストアドプロシージャーのCall • インプットパラメーターを インプットパラメーターを持つストアドプロシージャーの ストアドプロシージャーのCall • OracleとDB2での呼び出しに違いはない • インプットインプットパラメーターまたは直接、値を指定する • ストアドプロシージャーから ストアドプロシージャーから返 から返される結果 される結果セット 結果セット • Oracleでは、registerOutParameter()メソッドをCURSORのアウトパラ メーターを登録するするために使用する • DB2 9.7では、DB2TypeクラスのCURSORをアウトパラメーターに登録 することで同じようなシンタックスで記述できる 14 © 2009 IBM Corporation インプットパラメーターを持つストアドプロシージャーのCall • インプットパラメーターを インプットパラメーターを持つストアドプロシージャーの ストアドプロシージャーのCall • インプットパラメーターを持つストアドプロシージャーを作成 CREATE OR REPLACE PROCEDURE sproc1( in_parm1 IN INTEGER, out_parm2 OUT VARCHAR2) • OralceまたはDB2のインプットパラメーターを持つストアドプロシージャーの JavaからのCall String procName = "sproc1" String SP_CALL = "call " + procName + "(:in_parm1, :out_parm2)"; // Connect to the database Connection conn = DriverManager.getConnection (url, userName, password); CallableStatement stmt; try { stmt = conn.prepareCall(SP_CALL); stmt.setInt(1,10); stmt.registerOutParameter(2, Types.VARCHAR); stmt.execute(); // ... } 15 © 2009 IBM Corporation ストアドプロシージャーから返される結果セット(1) • 結果セット 結果セットを セットを返すストアドプロシージャーの ストアドプロシージャーのCall • CURSORタイプのアウトパラメーターを持つプロシージャーを作成 CREATE OR REPLACE PROCEDURE sproc2(oCursor OUT SYS_REFCURSOR) AS BEGIN open oCursor for select last_name from employees; END; • Oracleでは、結果セットの登録にregisterOutParameter() メソッドを使用する String SP_CALL = "{call sproc2}"; // Connect to the database Connection conn = DriverManager.getConnection (url, userName, password); try { CallableStatement stmt = conn.prepareCall(SP_CALL); stmt.registerOutParameter (1, OracleTypes.CURSOR); stmt.execute(); ResultSet rs = (ResultSet) stmt.getObject(1); while(rs.next()) { System.out.println(rs.getString(1)); // ... } } 16 © 2009 IBM Corporation ストアドプロシージャーから返される結果セット(2) • 結果セット 結果セットを セットを返すストアドプロシージャー • DB2 9.7では、 DB2Types.CURSORとしてアウトパラメーターを登録 することで、同じようなシンタックスで記述できる String SP_CALL = "{call sproc2(?)}"; // Connect to the database Connection conn = DriverManager.getConnection (url, userName, password); try { CallableStatement stmt = conn.prepareCall(SP_CALL); stmt.registerOutParameter (1, DB2Types.CURSOR); stmt.execute(); ResultSet rs = (ResultSet) stmt.getObject(1); while(rs.next()) { System.out.println(rs.getString(1)); // ... } } 17 © 2009 IBM Corporation ストアドプロシージャーから返される結果セット(3) • 結果セット 結果セットを セットを返すストアドプロシージャーの ストアドプロシージャーのCall • もし、CURSORタイプが使用できない場合には、結果セットをハンドリングする ためにいくつかの変更が必要 String SP_CALL = "{call sproc2}"; // Connect to the database Connection conn = DriverManager.getConnection (url, userName, password); try { CallableStatement stmt = conn.prepareCall(SP_CALL); ResultSet rs = null; stmt.execute(); rs = stmt.getResultSet(); while(rs.next()) { System.out.println(rs.getString(1)); // ... } } 18 © 2009 IBM Corporation カーソルタイプを返すファンクション (1) • プロシージャーのように プロシージャーのようにカーソル のようにカーソルを カーソルを返すことが出来 すことが出来る 出来るファンクション CREATE TYPE CursorType IS REF CURSOR; CREATE OR REPLACE FUNCTION sfunc4(v_num IN INTEGER) RETURN CursorType • Oracleでは、特殊なシンタックス(以下のSP_CALLの内容)で結果セットを返 すことができる String SP_CALL = "{? = call sfunc4(?)}"; // Connect to the database Connection conn = DriverManager.getConnection (url, userName, password); try { CallableStatement stmt = conn.prepareCall(SP_CALL); stmt.registerOutParameter (1, OracleTypes.CURSOR); stmt.setInt(2, 6); stmt.execute(); ResultSet rs = (ResultSet) stmt.getObject(1); while(rs.next()) { // ... } } 19 © 2009 IBM Corporation カーソルタイプを返すファンクション(2) • DB2の のJDBCドライバー ドライバーでは ドライバーでは、 では、カーソルタイプを カーソルタイプを返すファンクションを ファンクションを呼び出すシンタックスを シンタックスをサポートしていな サポートしていな い • ファンクションからプロシージャーへ変更を行う CREATE TYPE CursorType IS REF CURSOR; CREATE OR REPLACE PROCEDURE sfunc4 (v_num IN INTEGER, oCursor OUT CursorType) • 特殊な呼び出し(SP_CALL部分)を次のように変更する String SP_CALL = "{call sfunc4(?)}"; // Connect to the database Connection conn = DriverManager.getConnection (url, userName, password); try { CallableStatement stmt = conn.prepareCall(SP_CALL); stmt.setInt(1, 6); stmt.execute(); ResultSet rs = stmt.getResultSet(); while(rs.next()) { // ... } } • 注意:このファンクションを別のアプリケーションが使用している場合には同じように変更が必要 20 © 2009 IBM Corporation Oracle Pro*C • Oracle 埋め込みSQLの環境 • C/C++ or Cobolのコードの中にSQLを記述 • プログラムをコンパイルするためにプリコンパイラーが必要 • #1 プリコンパイラーがソースコードに埋め込まれたSQLをOracleのファンクションコール に置き換える • #2 C/C++コンパイラーを使用してコンパイルとリンクを行う • 特徴 • データベースとのやりとりではホスト変数を使用する • C Data Typeの変数、構造体、配列など • 静的と動的SQL • エラーチェックとハンドリング – SQLCA • Oracle 9.2以降Oracle Pro*Cへの機能追加はほとんどない • Oracle Pro*CのアプリケーションはPL/SQLやJavaに比べると多くはない • ほとんどが古くに記述されたアプリケーション • 最近はJavaで書かれたアプリケーションが多い 21 © 2009 IBM Corporation DB2組み込みSQL • DB2 組み込みSQLの の環境 • C/C++, Cobolのコードの中にSQLを記述 • Oracleのように のようにプリコンパイラー のようにプリコンパイラーが プリコンパイラーが必要 • #1 DB2のプリコンパイラーは、ソースコードに埋め込まれたSQLをDB2のAPIコールに 置き換える • #2 C/C++コンパイラーを使用してコンパイルとリンクを行う • 特徴 • データベースとのやりとりではホスト変数を使用する • C Data Typeの変数、構造体、(配列は使用できない)など • 静的と動的SQL • エラーチェックとハンドリング - SQLCA プリコンパイル済み ソース コンパイル /リンク 実行 ファイル ソース precompiler DB2 プログラム バインド ファイル 22 BIND パッケージ © 2009 IBM Corporation 組み込みSQL - C/C++ DB2 applicationのビルド • program.sqc • ソースファイルに"EXEC SQL"セクションを含む program.sqc • program.c • プリコンパイラによってC/C++コンパイラがコンパイ ル可能なソースファイルが生成される program.c • "EXEC SQL"セクションはネイティブのDB2 API コールに置き換えられるl • program.bnd • "EXEC SQL" セクションの内容を含むファイル • ターゲットデータベースにパッケージを作成するこ とが出来る • program program.bnd • コンパイラーとリンカーで実行ファイルを作成 • Sample program and build tool • サンプルコードとビルドツールがインスタンスホー ム・ディレクトリにある ($HOME/sqllib/samples/c) program • bldapp (またはbldapp.bat)は、プリコンパイル、コ ンパイル、バインドを行うツール 23 © 2009 IBM Corporation 組み込みSQL - 静的SQLと動的SQL • 静的SQL 静的 • 静的SQLでは、SQLを実行する際のPREPARE処理(権限チェック、SQLの解析、アクセスプランの 選択)をバイパスでき • アプリケーションからSQLストリングのハンドリングを行わないため、セキュアなSQLの実行環境 • 動的SQL 動的 • 動的SQLはPREPARE処理が必要 PREPARE 24 © 2009 IBM Corporation 組み込みSQL - 接続ストリングの変更 • Oracleでは では、 つだけのデータベース では、1インスタンス( インスタンス(サービス名 サービス名)は1つだけの つだけのデータベースを データベースを管理する 管理する • データベース名の指定は必要ない EXEC SQL CONNECT :user_name IDENTIFIED BY :password; • DB2では では、 では、同じインスタンスで インスタンスで複数の 複数のデータベースを データベースを作成できる 作成できる • 接続する時にデータベースの指定が必要 EXEC SQL CONNECT TO :dbname USERID :userid USING :password; 25 © 2009 IBM Corporation 組み込みSQL - ホスト変数(1) • 変数の 変数の宣言の 宣言の移行 • 1) Oracleの表定義をDB2のデータタイプにマップする • 2) DB2のデータタイプをCデータタイプにマップする • Varcharの の宣言 • DB2の組み込みSQLではホスト変数としてVARCHARデータタイプをサポートしていない • VARCHARの宣言を構造体に変更 Oracle Varcharの の宣言 EXEC SQL BEGIN DECLARE SECTION; VARCHAR emp_name[25]; EXEC SQL END DECLARE SECTION; DB2 構造体への 構造体への変更 への変更 EXEC SQL BEGIN DECLARE SECTION; struct { short var_len ; char var_data[25] ; } emp_name ; EXEC SQL END DECLARE SECTION; charへの への変更 への変更でも 変更でも可能 でも可能 EXEC SQL BEGIN DECLARE SECTION; CHAR emp_name[25 + 1]; EXEC SQL END DECLARE SECTION; 26 © 2009 IBM Corporation 組み込みSQL - ホスト変数(2) • INTEGERの のホスト変数 ホスト変数の 変数の宣言 • アプリケーションのポータビリティを良くするために、INTEGERのホスト変数にsqlint32を使 用し、BIGINTのホスト変数にsqlint64を使用する • long型のホスト変数あった場合、PrepコマンドはSQL0402Nエラーを返します • もし、long型のホスト変数を使用する場合は"LONGERROR NO"オプションを使用してPREPコマン ドを実行する • long型のホスト変数が許可され、これをBIGINTのホスト変数として扱う Oracle DB2 longの の宣言 sqlint32/sqlint64に に変更 EXEC SQL BEGIN DECLARE SECTION; long var_counter; EXEC SQL END DECLARE SECTION; EXEC SQL BEGIN DECLARE SECTION; sqlint32 var_counter ; EXEC SQL END DECLARE SECTION; または EXEC SQL BEGIN DECLARE SECTION; sqlint64 var_counter ; EXEC SQL END DECLARE SECTION; 27 © 2009 IBM Corporation 組み込みSQL - ホスト変数(3) • Oracleホスト ホスト配列 ホスト配列 (1) • Pro*Cのプログラムでは、配列を使用したホスト変数の宣言が出来る • DB2では配列のホスト変数はサポートしていない Oracle 配列の 配列のホスト変数 ホスト変数を 変数を使用して 使用して1回 して 回のフェッチで フェッチで配列全体に 配列全体にフェッチする フェッチする EXEC SQL BEGIN DECLARE SECTION; long int dept_numb[10]; char dept_name[10][14]; char v_location[12]; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE CUR1 CURSOR FOR SELECT DEPTNUMB, DEPTNAME FROM org WHERE LOCATION = :v_location; EXEC SQL FETCH CUR1 INTO :dept_numb, :dept_name; 28 © 2009 IBM Corporation 組み込みSQL - ホスト変数 (4) • Oracleホスト ホスト配列 ホスト配列 (2) DB2 1回 回のフェッチでは フェッチでは配列全体 では配列全体への 配列全体へのフェッチ へのフェッチはできない フェッチはできない EXEC SQL BEGIN DECLARE SECTION; sqlint32 h_dept_numb = 0; char h_dept_name[14] = {'¥0'}; char v_location[12] = {'¥0'}; EXEC SQL END DECLARE SECTION; /* move array out of DECLARE section - just C variables */ long int dept_numb[10]; char dept_name[10][14]; short int i = 0; EXEC SQL DECLARE CUR1 CURSOR FOR SELECT DEPTNUMB, DEPTNAME FROM org WHERE LOCATION = :v_location; /* Fetch one row at the time and move to corresponding member of array */ for (i=0;i<11;i++){ EXEC SQL FETCH CUR1 INTO :h_dept_num, :h_dept_name; if (SQLCODE == 100) break; dept_numb[i] = h_dept_numb; strcpy(dept_name[i], h_dept_name); } 29 © 2009 IBM Corporation 組み込みSQL - エラーメッセージと警告 • SQLCA (SQL Communication Area)は は、 診断情報の 診断情報のチェックや チェックやイベントハンドリングのための イベントハンドリングのための情報 のための情報を 情報を 提供する 提供する • プログラムの を定義する プログラムの中でSQLCAを 定義する方法 する方法 • EXEC SQL INCLUDE SQL SQLCA • sqlca構造体が宣言される • SQLの の実行後に をチェックする 実行後にSQLを チェックする • DB2と とOracleで で同じ構造体 • エラーメッセージを エラーメッセージを取得するための 取得するためのAPI するための rc=sqlaintp(msg_buffer, 1024, 80, sqlca.sqlcode); • SQLSTATEに に関連する 関連するエラーメッセージ するエラーメッセージを エラーメッセージを取得する 取得するAPI する rc=sqlogstt(msg_sqlstate_buffer, 1024, 80, sqlca.sqlcode); 30 © 2009 IBM Corporation 組み込みSQL – エラーハンドリング • エラーハンドリングの とDB2で で似ている エラーハンドリングの仕組みは 仕組みはOracleと みは • DB2では ではWHENEVERステートメント ステートメントを では ステートメントを使用する 使用する • SQL EXEC WHENEVER <CONDITION> <ACTION> • <CONDITION>: SQLERROR, SQLWARNING, NOT FOUND • <ACTION>: CONTINUE, GOTOラベル • Oracle Pro*C では上記 では上記の 上記のアクションに アクションに加え以下の 以下のアクションの アクションの指定も 指定も可能: 可能 • STOP • DO procedure-call • これらはGOTOアクションで同じような処理が可能 31 © 2009 IBM Corporation ブランク・ ブランク・ページ 32 © 2009 IBM Corporation What is PHP? • PHP (PHP Hypertext Preprocessor)は はWebアプリケーショ アプリケーショ ンを開発するための 開発するためのオープンソース するためのオープンソースの オープンソースのスクリプト言語 スクリプト言語 • Webアプリケーション アプリケーション開発 アプリケーション開発の 開発の言語として 言語として広 として広く使用されている 使用されている • いくつかのベンダー いくつかのベンダーの ベンダーのデータベースへの データベースへのアクセス へのアクセスも アクセスも可能 • PHP 5では では、 、XMLなどの などの機能 では、Web Service、 などの機能も 機能も含まれている 33 © 2009 IBM Corporation PHP - 環境のセットアップ • http://www.php.netから からDownload から • – PHP 5.2.8 と PECL (PHP Extension Community Library) modules package • PHPの のzipを をインストールディレクトリに ) インストールディレクトリに解凍( 解凍(例:C:¥php) • PECL moduleの のzipを をC:¥php¥ext¥ディレクトリ ディレクトリに ディレクトリに解凍 • C:¥phpに にテンプレート( )からphp.iniを を作成 テンプレート(php-recommended.ini) から • php.iniの の変更: 変更: • PDO extensionとpdo_ibmドライバーを使用するために以下の行を追加する • extension=php_pdo.dll • extension=php_pdo_ibm.dll • ibm_db2 extensionを使用可能にするために以下を追加 • extension=php_ibm_db2.dll • httpd.confファイル ファイルに 以下の行を追加することで 追加することでApache HTTP Server 2.xで でPHPを を動かすことができ ファイルに以下の することで る LoadModule php5_module‘c:/php/php5apache2.dll' AddType application/x-httpd-php .php PHPIniDir ‘c:/php' 34 © 2009 IBM Corporation PHP - DB2への接続方法 • 3つの方法 つの方法がある 方法がある • PHP Data Objects (PDO) + PDO_ODBC • PHP 5.1でのオブジェクト指向型のインターフェース • 2つのオブジェクトがある:PDO(connection)とPDOStatement(statementobject) $ conn = new PDO("odbc:$database", $user, $password) • IBM DB2 エクステンション(ibm_db2) エクステンション • 手続き型のインターフェース $ conn = db2_connect($database, $user, $password) • Unified ODBC • 新しく作成するアプリケーションでは推奨しない • 手続き型のインターフェース $ con = odbc_connect(“sample”, “user”, “pwd”) 35 © 2009 IBM Corporation PHP – DB2への移行 • Unified ODBCを を使用した 使用したアプリケーション したアプリケーション • ibm_db2を使用するように書き換える • "odbc_"で始まるファンクションを“db2_”に変更する • PHP Data Objects • 多くのデータベースへのポータビリティがある <?php try { $dbh = new PDO("OCI:", "username", "password") } catch (PDOException $e) { echo $e->getMessage(); } ?> 36 <?php try { $dbh = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=accounts; HOSTNAME=1.2.3,4;PORT=56789;PR OTOCOL=TCPIP;", "username", "password" ) } catch (PDOException $e) { echo $e->getMessage(); } ?> © 2009 IBM Corporation PHP – DB2への移行 • Oracleは は2つのインターフェース つのインターフェースを インターフェースを提供 • PDO_OCI • OCIライブラリーを経由したデータベースアクセスのためのPDOインターフェース • 記述方法やオブジェクトが同じなので移行が容易 • OCI8 • Oracle OCIインターフェースを使用したネイティブのOracleエクステンション • ibm_db2エクステンションと同じような機能を持っているが移行の際にはマッピングを行う必要がある • 例: oci_connect oci_bind_by_name oci_parse 37 to to to db2_connect db2_bind_param db2_prepare © 2009 IBM Corporation PHP – DB2への移行 • PHPから から呼 から呼び出されるサンプル されるサンプルの サンプルのプロシージャー CREATE OR REPLACE PROCEDURE Greeting (name IN VARCHAR2, message OUT VARCHAR2) AS BEGIN message := 'Hello ' || UPPER(name) ||', the date is: ' || SYSDATE; END; • 次ページ以降 チャートで とibm_db2との との違 ページ以降の 以降の2チャート チャートでOCI8と との違いを説明 いを説明 • 共に上記のプロシージャーを呼び出す • DB2のコードへ移行するためにはいくつかの変更が必要 38 © 2009 IBM Corporation PHP – DB2への移行 • Oracleに に作成されている プロシージャーを するPHPの のコード 作成されているGreetingプロシージャー されている プロシージャーをCallする する <?php $conn = oci_connect("userid","password") or die; $sql = "BEGIN Greeting(:name, :message); END;"; $stmt = oci_parse($conn,$sql); // Bind the input parameter oci_bind_by_name($stmt,":name",$name,32); // Bind the output parameter oci_bind_by_name($stmt,":message",$message,100); // Assign a value to the input $name = "Ariel"; oci_execute($stmt); // $message is now populated with the output value print "$message¥n"; ?> • 実行結果 $ php oraGreeting.php Hello ARIEL, the date is: 06-MAR-07 39 © 2009 IBM Corporation PHP – DB2への移行 • DB2用 用に移行した コード 移行したPHPコード した <?php $database = 'sample'; $conn = db2_connect($database, "userid", "password") or die; if ($conn) { $sql = 'CALL Greeting(?, ?)'; $stmt = db2_prepare($conn, $sql); // Initialize the parameters $name = 'Ariel'; $message = ''; // Bind the input and output parameters db2_bind_param($stmt, 1, "name", DB2_PARAM_IN); db2_bind_param($stmt, 2, "message", DB2_PARAM_OUT); db2_execute($stmt); // $message is now populated with the output value print "$message¥n"; } ?> 40 © 2009 IBM Corporation PHP – DB2への移行 • oci_connectと とdb2_connect • oci_connect (Oracle) • oci_connectでのデータベース名の指定はオプション oci_connection (string $username, string $password [, string $db [, string $charset [, int $session_mode]]] ) • db2_connect (DB2) • DB2ではデータベース名は必須 db2_connection (string database, string username, string password, [array options]) • カタログされていないデータベースに接続するためには、追加プロパティの設定が必要になる $conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE='sample'; HOSTNAME='localhost';PORT='50000';PROTOCOL=TCPIP; UID='userid';PWD='password';"; $conn = db2_connect($conn_string, '', ''); 41 © 2009 IBM Corporation PHP – DB2への移行 • oci_bind_by_nameと とdb2_bind_param • パラメーターマーカーに変数をバインドするための関数 • oci_bind_by_name (Oracle) oci_bind_by_name( resource $statement, string $ph_name, mixed &$variable [, int $maxlength [, int $type]] ) • db2_bind_param db2_bind_param(resource stmt, int parameter-number, string variable-name, [int parameter-type, [int data-type, [int precision, [int scale]]]]) • 変更例 input parameterへの へのバインド へのバインド oci_bind_by_name($stmt,':name',$name,32); db2_bind_param($stmt, 1, "name", DB2_PARAM_IN); output parameterへの へのバインド へのバインド oci_bind_by_name($stmt,':message',$message,100); db2_bind_param($stmt, 2, "message", DB2_PARAM_OUT); 42 © 2009 IBM Corporation PHP – DB2への移行 • oci_parseと とdb2_prepare • SQLのparseを行う関数 • これらは同じ機能なので、関数名の変更のみ • oci_parse oci_parse( resource $connection, string $query ) • db2_prepare db2_prepare(resource connection, string statement, [array options]) 変更例 $sql = 'BEGIN Greeting(:name, :message); END;'; $stmt = oci_parse($conn,$sql); $sql = 'CALL Greeting(?, ?)'; $stmt = db2_prepare($conn, $sql); 43 © 2009 IBM Corporation ブランク・ ブランク・ページ 44 © 2009 IBM Corporation ODBCとCall Level Interface (DB2 CLI) • DB2 ODBC Driver • ドライバーマネージャーは動的にデータ ベース毎のドライバーをロード • DB2 CLI Driver • ODBCに準拠 • 1つのアプリケーションから複数のコネク ション • SQL Data Type • ODBCアプリケーション アプリケーションは アプリケーションは殆ど変更なく 変更なく DB2 CLI Driverで で実行可能 45 Application Application Application ODBC API ODBC Driver Manager Service Provider API Other ODBC Driver DB2 ODBC Driver Other Client DB2 Client Other DBMS DB2 Application Application Application ODBC + DB2 CLIAPI DB2 Call Level Interface Driver Driver DB2 Connect DB2 Client DB2 family DB2 LUW © 2009 IBM Corporation Data Server Driver for ODBC and CLI • ODBCアプリケーション アプリケーションから に接続するための アプリケーションからDB2に から 接続するための設定 するための設定 • DB2 ODBC Driverのインストール • Data Server Client or Data Server Runtime Client • Data Server Driver for ODBC and CLI • DB2OREG1.EXEを使用してMicrosoft ドライバーマネージャーへ の登録(登録が行われていない場合) • データベースのODBC Data sourceへのカタログ • アプリケーションのビルドとodbc32.libへのリンク 46 © 2009 IBM Corporation ODBC - 移行 • DB2 ODBC Driverの のセットアップ • アプリケーションの アプリケーションの移行は 移行は比較的容易 • データベース固有 データベース固有の 固有の項目を 項目を変更 •例 • SQLの変更 • ストアドプロシージャーとファンクションの呼び出しの変更 47 © 2009 IBM Corporation ブランク・ ブランク・ページ 48 © 2009 IBM Corporation .NET Framework – ADO .Net – Database Applications • .NETアプリケーション アプリケーションでは 使用が必要 アプリケーションではデータプロバイダー ではデータプロバイダーを データプロバイダーを使用が • データプロバイダーは.NETアプリケーションとDB2クライアントまたはOracleクライアントとの間のレイ ヤー • ADO .NET Data Providerは は以下の 以下の基本クラス 基本クラスで クラスで構成される 構成される • Connection: データベースとの接続の確立や管理 • Command:SQLの実行 • Parameter:Commandで使用するパラメーターの設定 • DataAdapter:DataSetとデータソース間のデータの受け渡し • DataReader:データベースから返される結果セットの読み取り • Oracleと とDB2はどちらも はどちらもADO .NETのための のためのデータ はどちらも のためのデータ・ データ・プロバイダーを プロバイダーを提供 • Oracle Data Provider for .NET(ODP .NET) • IBM Data Server Provider for .NET 49 © 2009 IBM Corporation .NET – OracleからDB2への移行 • 多くのケース での機能 くのケースで ケースでOracle .NET Data Providerでの での機能と 機能と同等の 同等の機能を 機能をDB2 .NET Data Providerでも でも提供 でも提供していて 提供していて、 していて、クラスの クラスの置き換えが可能 えが可能 Oracle DB2 Dim conn As New OracleConnection(con_str) Dim conn As New DB2Connection(db1) Dim cmd As New OracleCommand cmd.Connection = conn cmd.CommandText = "select * from employees where dept_code = 'IT'" Dim cmd As New DB2Command cmd.Connection = conn cmd.CommandText = "select * from employees where dept_code = 'IT'" Dim dr as OracleDataReader = cmd.ExecuteReader() Dim dr as DB2DataReader = cmd.ExecuteReader 50 © 2009 IBM Corporation Ruby On Rails • IBM_DB Ruby Driverと とRails adapter( (IBM_DB gemによって によって提供 のアプリケーショ によって提供) 提供)を使用して 使用してRubyの して ンからDB2への への接続 から への接続ができる 接続ができる • IBM_DB gemの のインストールと からDB2への へのアクセス インストールとRubyから から へのアクセスの アクセスの設定 • Ruby on Railsのセットアップの確認 • IBM_DB adapterとdriverは以下のコマンドでインストール gem install ibm_db • Rails 2.0以前のバージョンの場合にはIBM_DB adapterをRailsフレームワークのconnection adaptersのリストに手動で追加する RAILS_CONNECTION_ADAPTERS = %w( mysql postgresql sqlite firebird sqlserver db2 oracle sybase openbase frontbase ibm_db ) • Windows以外のプラットフォームではIBM_DB_DIRとIBM_DB_LIBの環境変数の設定を行う $ export IBM_DB_DIR=/opt/ibm/db2/V9.5 $ export IBM_DB_LIB=/opt/ibm/db2/V9.5/lib 51 © 2009 IBM Corporation Ruby On Rails • MVC (Model – View – Controller) • Railsでは、"scaffolding"を使用してMVCモデルの開発のベースとなるアプリケーションを作る User input and event processing controller View model DB2 • ActiveRecord Subsystem • ActiveRecordはDB2のテーブル(行)へのアクセスを行うためのクラス • テーブルとmodelオブジェクトをマッピングしている • クラス名とクラスの定義はRuby on Railsで提供されているgenerateスクリプトを使用してデータベー ス上の表名や表定義から生成される 52 © 2009 IBM Corporation Ruby On Rails • DB2への へのアクセス のコード へのアクセスを アクセスを行うRuby on Railsの class SampleTable < ActiveRecord::Base has_one :row_id has_one :name end sampletables DB2 Row_id name ... ... Controller: SampleTable.find(:all, :order => 'row_id ASC’) 以下のような 以下のような記述 のような記述も 記述も可能: 可能 SampleTable.find_by_sql("SELECT s.* FROM sampletables s ORDER BY s.row_id ASC") 53 © 2009 IBM Corporation Let’s go to Lab6!! 54 © 2009 IBM Corporation