...

Oracle 第5章 からのアプリケーション移行

by user

on
Category: Documents
167

views

Report

Comments

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
Fly UP