88
© 2013 IBM Corporation OracleからDB2 10への移行 DB2の機能、ツール、および移行ポイント 1 20131日本アイ・ビー・エム株式会社 本資料掲載事項は、ある特定の環境・使用状況においての正確性がIBMによって確認されていますが、すべての環境において同様の結果が得られる保証は ありません。これらの技術を自身の環境に適用する際には、自己の責任において十分な検証と確認を実施いただくことをお奨めいたします。

OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

  • Upload
    others

  • View
    13

  • Download
    1

Embed Size (px)

Citation preview

Page 1: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

OracleからDB2 10への移行 - DB2の機能、ツール、および移行ポイント -

1

2013年1月

日本アイ・ビー・エム株式会社

本資料掲載事項は、ある特定の環境・使用状況においての正確性がIBMによって確認されていますが、すべての環境において同様の結果が得られる保証はありません。これらの技術を自身の環境に適用する際には、自己の責任において十分な検証と確認を実施いただくことをお奨めいたします。

Page 2: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

内容

DB2とOracleの用語

Oracleからの移行を容易にするDB2の機能

移行ロードマップ

移行ツール

Oracleからの移行ポイント

2

※当資料はDB2 V10.1 for Linux, UNIX, and Windows Fix Pack 1の環境に基づいています。

Page 3: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation 3

DB2とOracleの用語

Page 4: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DB2とOracleの用語

4

Oracle DB2

設計

インスタンス インスタンスまたはデータベース・マネージャー

オンラインREDOログ アクティブ・ログ

アーカイブ・ログ アーカイブ・ログ

非アーカイブ・ログ・モード 循環ロギング

データ・ファイル コンテナー

SYSTEM 表スペース SYSCATSPACE 表スペース

表スペース 表スペース

エクステント エクステント

データ・ブロック データ・ページ

セグメント ストレージ・オブジェクト

パーティション表 パーティション表

マテリアライズ・ビュー マテリアライズ照会表 (MQT)

グローバル索引 非パーティション索引

ローカル索引 パーティション索引

データ・ディクショナリー システム・カタログ

Page 5: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DB2とOracleの用語

5

Oracle DB2

設定/メモリー

ORACLE_SID 環境変数 DB2INSTANCE 環境変数

init.ora および Server Parameter File (SPFILE) データベース・マネージャー構成ファイルおよびデータベース構成ファイル

System Global Area (SGA) インスタンス共有メモリーおよびデータベース共有メモリー

Program Global Area (PGA) アプリケーション共有メモリーおよびエージェント専用メモリー

User Global Area (UGA) アプリケーション・グローバル・メモリー

データ・バッファー・キャッシュ バッファー・プール

ラージ・プール ユーティリティー・ヒープ

ライブラリー・キャッシュ パッケージ・キャッシュ

データ・ディクショナリー・キャッシュ カタログ・キャッシュ

アプリ使用機能

グローバル一時表 グローバル一時表

カーソル共有 ステートメント・コンセントレーター

データベース・リンク ニックネーム

DUAL 表 DUAL 表

Oracle Call Interface (OCI) コール・レベル・インターフェース (CLI)

セッション セッション、データベース接続

バインド変数 パラメータ・マーカー

運用

動的なパフォーマンス・ビュー スナップショット・モニター SQL 管理ビュー

アラート・ログ 管理通知ログ

bdump ディレクトリー 診断ログ (db2diag.log)

startup nomount db2start

Page 6: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation 6

Oracleからの移行を容易にするDB2の機能

Page 7: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

移行における課題

Oracle の SQL および PL/SQL

Transact-SQL

DB2 の SQL/PL (SQL/PSM に基づく)

■ アプリケーションが、選択した RDBMS に特化している

– 異なる RDBMS へ移行するにはコードの大幅な書き直しが必要

– 既存スキルを活用できない

DB2は、これらの問題を解決するための機能を提供しており、その拡張を継続的に行っている

7

Page 8: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Oracleの各機能に対応するDB2の機能

8

Oracle – データ・タイプ – データ・ディクショナリー – SQL

• 基本的なDDL • データベース・リンク • マテリアライズド・ビュー • …

– 同時実行制御 – PL/SQL言語 – PL/SQLパッケージ – JDBC – Pro*C – OCI

– C言語のAPI

– Oracle Forms – SQL*Plus – SQL*Loader – RAC – …

DB2 – 互換フィーチャー – 互換フィーチャー – SQL

• ツール • Federation(フェデレーション) • マテリアライズ照会表、CDC※

• … – 同時実行制御(Currently Committed) – 互換フィーチャー – 互換フィーチャー – JDBC – 組み込みSQL(互換フィーチャー付) – DB2CI(Oracle互換)

– CLIがDB2本来のC言語用APIだが、 DB2CIもOracle互換APIとして提供

– パートナー製品の使用(Java Forms) – CLPPlus – IMPORT, LOAD, INGESTユーティリティ – DB2 pureScale – …

※ InfoSphere Change Data Capture

Page 9: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

互換フィーチャーの設定: DB2_COMPATIBILITY_VECTOR レジストリ変数

この変数をセットすることで、他DBとの互換フィーチャーを有効にする

db2set コマンドでセット

ビットごとに互換フィーチャーが定義

–例:

• 1ビット目: ROWNUM疑似列

• 2ビット目: DUAL表

有効化するビットを1にして16進数(HEX)で表す、または予約ワードをセット

–予約ワード

• ORA Oracle互換フィーチャーを最大限に活用

• SYB Sybase互換フィーチャーを最大限に活用

• MYS MySQL互換フィーチャーを最大限に活用

–例 • db2set DB2_COMPATIBILITY_VECTOR=FFFF

• db2set DB2_COMPATIBILITY_VECTOR=ORA (ORAは20FFFと同じ)

設定を変えたらDB2インスタンスの再起動を行う $ db2stop

$ db2start

9

Page 10: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DB2_COMPATIBILITY_VECTORで設定可能な互換フィーチャー

10

ビット位置 互換性フィーチャー コメント

1 (0x01) ROWNUM ROW_NUMBER() OVER() の同義語

2 (0x02) DUAL DUAL ダミー表を使用可能化

3 (0x04) 外部結合演算子 外部結合演算子 (「+」記号) のサポートを使用可能化。

4 (0x08) 階層照会 CONNECT BY 節を使用した階層照会のサポート。

5 (0x10) NUMBER ※ NUMBER データ・タイプおよび関連した数値処理のサポート

6 (0x20) VARCHAR2 ※ VARCHAR2 型と NVARCHAR2 データ・タイプおよび関連した文字ストリング処理

7 (0x40) DATE ※ DATE データ・タイプを TIMESTAMP(0) データ・タイプとして変換処理可能

8 (0x80) TRUNCATE TABLE TRUNCATE ステートメントの代替セマンティック

9 (0x100) 文字リテラル CHAR データ・タイプまたは GRAPHIC データ・タイプ (VARCHAR データ・タイプまたは

VARGRAPHIC データ・タイプの代替)

10 (0x200) コレクションのメソッド

配列での演算を実行するためのメソッド (first、last、next、およびprevious など) を

使用可能化。 配列内の特定のエレメントを参照するときに大括弧の代わりに小括弧を使用可能化。 例: 「array1(i)」は「array1」のエレメント「i」を参照する。

11 (0x400) データ・ディクショナリー互換ビュー ※ データ・ディクショナリー互換ビューはデータベースの作成時に作成

12 (0x800) PL/SQL コンパイル PL/SQL ステートメントのコンパイルおよび実行の可能化

13 (0x1000) インセンシティブ・カーソル SELECT ステートメントが明示的に FOR UPDATE を指定しない場合、WITH RETURN で定義されたカーソルがインセンシティブになる。

14 (0x2000) INOUT パラメーター INOUT パラメーター宣言に対する DEFAULT の指定

17 (0x10000) SQL データ・アクセス・レベルの強制 実行時にルーチンが SQL データ・アクセス・レベルを強制可能。

18 (0x20000) Oracleデータベース・リンク構文 Oracleデータベース・リンク構文を有効にする

※ データベース作成前に設定必要

参照URL: http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.apdv.porting.doc/doc/r0052867.html

Page 11: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

互換フィーチャー例

以下の互換フィーチャーを有効にする

–ビット5 (0x10): Oracle NUMBER互換

–ビット6 (0x20): Oracle VARCHAR2互換

–ビット7 (0x40): Oracle DATE互換

–ビット11(0x400): Oracleデータ・ディクショナリー互換ビュー

0x10 + 0x20 + 0x40 + 0x400 = 0x470

設定はDB2インスタンスを再起動して有効になる。その後、データベースを作成する $ db2set DB2_COMPATIBILITY_VECTOR=470

$ db2stop

$ db2start

$ db2sample -name oradb

データ・タイプ互換の確認

–データ・タイプ互換の場合、DB構成情報で確認可能 $ db2 get db cfg for oradb

NUMBER データ・タイプの互換性 = ON

VARCHAR2 データ・タイプの互換性 = ON

データ・タイプ DATE の TIMESTAMP(0) への互換性 = ON

11

← サンプルDBを作成

Page 12: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Oracleデータ・ディクショナリー互換ビューの確認

Oracleデータ・ディクショナリー互換ビューの例

–接続ユーザーが作成した表情報の取得 select * from user_tables

–接続ユーザーが作成したビュー情報の取得 select * from user_views

参照URL http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.apdv.porting.doc/doc/c0054440.html

DB2が提供しているカタログ・ビューも引き続き使用可能

–接続ユーザーが作成した表名(スキーマ名.表名)の取得 select tabschema, tabname from syscat.tables where type='T' and

owner=current user

–接続ユーザーが作成したビュー名とビュー定義の取得 select viewschema, viewname, text from syscat.views where

owner=current user

参照URL http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0011297.html

12

Page 13: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

互換フィーチャーの追加設定

互換フィーチャーの追加設定前 $ db2 -td/

db2 => select lastname,deptname from employee e, department d where e.workdept(+)=d.deptno/

SQL0104N "(+" に続いて予期しないトークン ")"

が見つかりました。予期されたトークンに "(" が含まれている可能性があります。

SQLSTATE=42601

db2 => set serveroutput on/

DB20000I SET SERVEROUTPUT コマンドが正常に完了しました。

db2 => declare

i number;

begin

i := 10;

dbms_output.put_line('i=' || i);

end;

/

DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL

ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。

SQL0104N "BEGIN-OF-STATEMENT" に続いて予期しないトークン "declare i number;

begin i := 10;" が見つかりました。予期されたトークンに "<values>"

が含まれている可能性があります。 LINE NUMBER=1. SQLSTATE=42601

13

PL/SQL

Oracle特有の 外部結合演算子

Page 14: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

互換フィーチャーの追加設定

すべての互換フィーチャーをオンに設定変更して、既存のデータベースにアクセス $ db2set DB2_COMPATIBILITY_VECTOR=ORA

$ db2stop

$ db2start

$ db2 connect to oradb

$ db2 -td/

すべての互換フィーチャーをオンに設定した後の動作 db2 => select lastname,deptname from employee e, department d where e.workdept(+)=d.deptno/ LASTNAME DEPTNAME

--------------- ------------------------------------

HAAS SPIFFY COMPUTER SERVICE DIV.

- BRANCH OFFICE I2

- BRANCH OFFICE J2

48 レコードが選択されました。

db2 => select lastname,deptname from employee e right outer join department

d on e.workdept=d.deptno/

14

Oracle特有の 外部結合演算子

これは右外部結合。DB2本来の書き方は次のようになる(SQL92の規約に基づく)

Page 15: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

互換フィーチャーの追加設定

すべての互換フィーチャーをオンに設定した後の動作 db2 => set serveroutput on/

DB20000I SET SERVEROUTPUT コマンドが正常に完了しました。

db2 => declare

i number;

begin

i := 10;

dbms_output.put_line('i=' || i);

end;

/

DB20000I SQL コマンドが正常に完了しました。

i=10

db2 => begin

declare i integer;

set i = 10;

call dbms_output.put_line('i=' || i);

end

/

DB20000I SQL コマンドが正常に完了しました。

i=10

15

PL/SQL (Oracle互換フィーチャー)

SQL PL (DB2本来の機能も引き続き利用可能)

Page 16: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

PL/SQL互換フィーチャー

ネイティブ PL/SQL サポート: DB2 エンジンに PL/SQL コンパイラーも同梱 –エミュレーションなし(PL/SQLとSQL PLを同じレベルで実行可能)

–ソース・レベルのデバッグおよびプロファイル

Data Studio

PL/SQL

コンパイラー

SQL PL

コンパイラー

データベース

エディター

DB2 サーバー

SURE

(SQL Unified Runtime Engine)

デバッガー

プロファイラー

16

PL/SQLもSQL PLも アーキテクチャーは同じ

Page 17: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DB2 10 の組み込みパッケージ

フィーチャー 説明

DBMS_ALERT クロス・セッション・セマフォー

DBMS_DDL DDL オブジェクトの難読化

DBMS_JOB ジョブ・スケジューラー、管理のプロシージャー

DBMS_LOB LOB を操作する機能

DBMS_OUTPUT 「画面出力によるデバッグ」および簡単なレポート作成

DBMS_PIPE クロス・セッション・データ・パイプ

DBMS_SQL 動的 SQL を実行するためのプロシージャー・セット

DBMS_UTILITY さまざまな関数およびプロシージャー

MONREPORT データのモニターとテキスト・レポートの生成

UTL_DIR ディレクトリーの別名を維持するためのルーチン

UTL_FILE サーバー・サイドの I/O API

UTL_MAIL E メール送信機能(SMTPはDB構成情報定義を利用)

UTL_SMTP SMTP を指定したEメール送信機能

17

参照URL • http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.apdv.sqlpl.doc/doc/c0053670.html

Page 18: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

NUMBERデータ・タイプのサポート

NUMBERデータ・タイプは以下のように変換される

※ 値が16桁を超える場合、DECFLOAT(34) へ変更する

例 db2 => create table t1 (n1 number, n2 number(10), n3 number(20, 5));

db2 => describe table t1;

データ・タイ データ・ 列の スケ

列名 プ・スキーマ タイプ名 長さ ール NULL

------------------------------- --------- ------------------- ---------- ----- ------

N1 SYSIBM DECFLOAT 8 0 はい

N2 SYSIBM DECIMAL 10 0 はい

N3 SYSIBM DECIMAL 20 5 はい

db2 => insert into t1 values (10, 100, 1000.11), (200, 2000, 20000.22222);

db2 => select * from t1;

N1 N2 N3

------------------------ ------------ ----------------------

10 100. 1000.11000

200 2000. 20000.22222

18

Oracle DB2 数値のタイプ

NUMBERのみ指定 DECFLOAT(16) ※ 浮動小数点

NUMBER(最大桁数) DECIMAL(最大桁数) 整数

NUMBER(最大桁数, 小数点以下桁数) DECIMAL(最大桁数, 小数点以下桁数) 固定小数点

Page 19: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

端数の丸め込み方法

DECFLT_ROUNDING データベース構成パラメーターで設定

DB2の場合、デフォルトは ROUND_HALF_EVEN

–最も近い値に丸める

–正確に等間隔の場合、末尾が偶数になるように丸める

–例: db2 => create table t2 (n1 number, n2 number(5,2));

db2 => insert into t2 values (1234567890.1234565, 123.455);

N1 N2

------------------------ -------

1234567890.123456 123.46

db2 => delete from t2;

db2 => insert into t2 values (1234567890.12345651, 123.465);

N1 N2

------------------------ -------

1234567890.123457 123.46

Oracleの場合、四捨五入 (ROUND_HALF_UP)

– Oracleと同じ、四捨五入にする場合 update db cfg for [DB名] using DECFLT_ROUNDING ROUND_HALF_UP

参照URL – http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.admin.config.doc/doc/r0052298.html

19

1が付くと切り上げの方が近くなる

Page 20: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

振る舞いが変わる主な機能 (VARCHAR2)

VARCHAR データ・タイプに自動変換

この互換フィーチャーをオンにすると、VARCHARデータ・タイプの振る舞いが変わる

20

VARCHAR2互換なし VARCHAR2互換

空文字('')とNULLの区別 区別する 区別なし

(空文字はNULLに変換される)

非NULL制約 空文字の挿入可 空文字を挿入できない

文字列の比較 文字列末尾の空白の違いは無視して比較

文字列末尾の空白が違うものは違う文字として扱う

Page 21: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

振る舞いが変わる主な機能 (VARCHAR2)

21

create table t3 (c1 int,

c2 varchar(10) not null);

insert into t3 values (1, 'hello');

insert into t3 values (2, 'hello ');

select * from t3 where c2='hello';

C1 C2

----------- ----------

1 hello

2 hello

insert into t3 values (3, '');

DB20000I SQL コマンドが正常に完了しました。

select * from t3;

C1 C2

----------- ----------

1 hello

2 hello

3

VARCHAR2互換なし

非NULL制約でも空文字の挿入可

create table t3 (c1 int,

c2 varchar(10) not null);

insert into t3 values (1, 'hello');

insert into t3 values (2, 'hello ');

select * from t3 where c2='hello';

C1 C2

----------- ----------

1 hello

insert into t3 values (3, '');

SQL0407N NULL 値の NOT NULL 列

"TBSPACEID=3, TABLEID=7, COLNO=1"

への代入は許されていません。

SQLSTATE=23502

VARCHAR2としてもよい (VARCHARに自動変換)

VARCHAR2互換

文字列末尾の空白文字の違いを無視

空文字はNULLに変換される

Page 22: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

振る舞いが変わる主な機能 (DATE)

OracleのDATE型は時間を保持(時分秒)

DB2のDATE型は時間を保持しない

この互換フィーチャーをオンにすると、以下のような振る舞いとなる

22

DATE互換なし DATE互換

DATE型の列 DATE型のまま TIMESTAMP(0)に変換

CURRENT DATE

特殊レジスター

DATE値を戻す TIMESTAMP(0)値を戻す

日付の演算 + 1 day などと記述(1日加算)

以下の表記はDATE型ではエラーとなる(TIMESTAMP型で使用可能)

- 2 hour (2時間減算)

+ 3 minute (3分加算)

+ 1 で1日加算

- 2/24 で2時間減算

+ 3/24/60 で3分加算

Page 23: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

振る舞いが変わる主な機能 (DATE)

例: DATE互換なし

23

create table t4 (c1 int, c2 date);

select colname,typename,scale from syscat.columns where tabname='T4';

COLNAME TYPENAME SCALE

-------- ----------- -----

C1 INTEGER 0

C2 DATE 0

insert into t4 values (1, '2012-08-25');

insert into t4 values (2, '2012-09-05-10.20.30');

select * from t4;

C1 C2

----------- ----------

1 2012-08-25

2 2012-09-05

select to_char(c2,'YYYY/MM/DD HH24:MI:SS') from t4;

1

----------------------

2012/08/25 00:00:00

2012/09/05 00:00:00

select current date - 5 day from sysibm.sysdummy1;

1

----------

2012-08-30

時間は削除(無視)されて挿入される

Page 24: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

振る舞いが変わる主な機能 (DATE)

例: DATE互換

24

create table t4 (c1 int, c2 date);

select colname,typename,scale from syscat.columns where tabname='T4';

COLNAME TYPENAME SCALE

-------- ----------- -----

C1 INTEGER 0

C2 TIMESTAMP 0

insert into t4 values (1, '2012-08-25');

insert into t4 values (2, '2012-09-05-10.20.30');

select * from t4;

C1 C2

----------- -------------------

1 2012-08-25-00.00.00

2 2012-09-05-10.20.30

select to_char(c2,'YYYY/MM/DD HH24:MI:SS') from t4;

1

----------------------

2012/08/25 00:00:00

2012/09/05 10:20:30

select current date - 3 + 14/24 from dual;

1

-------------------

2012-09-02-01.58.45

Page 25: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

同時実行制御

分離レベル

(*) 青字がデフォルト

DB2の分離レベル CS では、Currently Committed の設定が可能

– DB構成パラメータ CUR_COMMIT で設定

– デフォルトは ON db2 get db cfg for [DB名]

CS 分離レベルで現在コミット済みの結果を戻す (CUR_COMMIT) = ON

25

ISO分離レベル DB2 Oracle

SERIALIZABLE REPEATABLE READ (RR) SERIALIZABLE

REPEATABLE READ READ STABILITY (RS) なし

READ COMMITTED CURSOR STABILITY (CS)

• Currently Committed機能

(CUR_COMMIT=ON|OFF)

READ COMMITTED

READ UNCOMMITTED UNCOMMITTED READ (UR) なし

Page 26: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

同時実行制御

Oracle の READ COMMITTED

–データの読み取り

• SQL文発行時点のコミット済みデータを取得 UNDOセグメントを使って実現(ログとUNDOセグメントの両方に書き込み)

• 別のトランザクションがデータを更新中でも、それがコミットされるのを待たない

• SQL文発行後にコミットされたデータは読まない

26

TRN1

TRN2

A

B

C

D

E

F

SELECT

UNDOセグメント

UPDATE

UPDATE

C

D

C’

D’

SCN=100 SCN=32

SCN=64

SCN=76 SCN=102

SCN = システム変更番号

COMMIT

読んだデータは最新とは限らないが、参照処理のロック待機は発生しない UNDOセグメントを使って実現(ログとUNDOセグメントの両方に書き込み)

Page 27: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

同時実行制御

DB2 の Currently Committed

–データを読み取る際、最新のコミット済みデータを取得し、別のトランザクションがデータを更新中でも、それがコミットされるのを待たない

• ログのみを使って実現

27

TRN1

TRN2

A

B

C

D

E

F

SELECT

トランザクションログ (ログバッファー)

UPDATE

UPDATE

C

D

C’

D’

読むデータは常に最新で、参照処理のロック待機も発生しない ログのみを使って実現

Page 28: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

データベース・リンク、マテリアライズド・ビューの移行

Oracleの代表的なDB連携

–データベース・リンク

• リアルタイムの外部Oracleへの仮想アクセス

–マテリアライズド・ビュー

• トリガー・ベースのテーブルの差分レプリケーション

28

DBLINK Oracle

Oracle

Oracle

SQL

Oracle

Oracle Oracle

マテリアライズド ・ビュー

SQL 差分トリガー

Page 29: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

データベース・リンク、マテリアライズド・ビューの移行

フェデレーションとInfoSphere Change Data Captureが解決!

–フェデレーション

• リアルタイムに外部の多様なDBへの仮想アクセス

– InfoSphere Change Data Capture

• ログベースのテーブルの差分レプリケーション

フェデレーション DB2

Oracle

SQL Server

SQL

DB2

DB2 Oracle

SQL

CDC

ログ

CDC

さまざまな データソースを サポート

(含非RDBデータ)

ログベースで 高速、軽量

29

Page 30: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation 30

リモートの表やビュー、ストアードプロシージャの仮想オブジェクト – ローカル・オブジェクトのように操作

リアルタイムの参照・更新が可能

マルチソースのJoinが可能

DB2 Oracle ニックネーム

ORACLE.SCOTT.EMP

ソース表

DB2ADMIN.ORAEMP

CREATE NICKNAME ORAEMP FOR ORACLE. SCOTT.EMP

ユーザー・アプリケーション

SELECT * FROM ORAEMP WHERE --------

多種多様なデータソースを表のイメージでアクセス

ニックネームは実体をもたない仮想的な表

フェデレーション機能によるニックネーム・アクセス

DB2 10.1 Fix Pack 1で以下の構文もサポート(Oracle互換フィーチャー:0x20000)

SELECT * FROM SCOTT.EMP@ORACLE WHERE --------

Page 31: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation 31

IBM InfoSphere Change Data Capture

高速、軽量、低負荷な差分レプリケーション – データベースのログから差分データを抽出

幅広いDB、プラットフォームのサポート – Oracle, DB2 for LUW, iSereis, z/OS, SQL Server, Sybase, Teradata, Netezza,

MQ, JMS, BEAなど

簡単な操作 – nonプログラミング。GUIによる容易な定義や操作

Point

Point

Point

データベース ログ

ソース側エンジン ターゲット側エンジン

TCP/IP

モニタリング機能と構成

データベース

メッセージ・キュー

DB2, Oracle, Microsoft SQL Server等

フラット・ファイル

Information Server DataStage

CDC CDC

Page 32: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

SQL*Loaderの移行

データを取り込むためのツール

DB2では、従来から、LOAD, IMPORTユーティリティを提供

– LOAD • データベース・コンテナー(ストレージ)に、フォーマット済みページを直接書き込む(処理が高速なので大量のデータ挿入に向いている)

• 参照整合性制約等のチェックは、別途、SET INTEGRITYコマンドを発行する必要がある(それまでロードした表にアクセスできない)

• トリガーは起動しない、等の制約がある

– IMPORT • INSERT文で実現

• 尐量のデータ挿入に向いている – 参照URL

• http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.admin.dm.doc/doc/r0004639.html

DB2 10 から、さらに、INGESTユーティリティを提供 – INGESTコマンド処理中も、アプリケーションからのデータ・アクセスが可能

– INSERT/REPLACEの他に、UPDATE/DELETE/MERGEが可能(簡易ETL処理が可能)

–再開可能なエラー発生時、最後にコミットした時点から再開が可能

–継続的なデータ挿入や、簡単なETL処理を行いたい場合に向いている – 参照URL

• http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.admin.dm.doc/doc/c0057237.html

32

Page 33: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

OracleのSQL*LoaderとDB2のLOAD

33

• SQL*Loader のコントロール・ファイル

• 固定長フォーマットをロードするコントロールファイルの例

• 固定長フォーマットの場合、POSITION() 指定を METHOD Lを用いた 指定に変更する

LOAD DATA

INFILE '/home/ora_usr/accounts.dat'

INTO TABLE accounts

( acct_id POSITION(0001:0003) NUMBER

,dept_code POSITION(0004:0006) CHAR

,acct_desc POSITION(0009:0100) VARCHAR2

,max_employees POSITION(0101:0103) NUMBER

,current_employees POSITION(0104:0106) NUMBER

,num_projects POSITION(0107:0107) NUMBER )

LOAD FROM

'/home/ora_usr/accounts.dat'

OF ASC

METHOD L

( 0001 0003

,0004 0006

,0009 0100

,0101 0103

,0104 0106 )

INSERT INTO accounts

( acct_id

,dept_code

,acct_desc

,max_employees

,current_employees );

Oracle SQL*Loader コントロールファイル DB2 Load コマンド

33

Page 34: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

OracleのSQL*LoaderとDB2のLOAD

34

• 可変長データの場合のコントロールファイル

• 可変長データの場合のコマンド比較

INFILE '/home/ora_usr/accounts.dat'

INTO TABLE accounts

FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED

BY '"'

( acct_id

,dept_code

,acct_desc

,max_employees

,current_employees

,num_projects )

LOAD FROM

'/home/ora_usr/accounts.dat'

OF DEL

MODIFIED BY CHARDEL"" COLDEL,

METHOD P (1, 2, 3, 4, 5 )

INSERT INTO accounts

( acct_id

,dept_code

,acct_desc

,max_employees

,current_employees );

101,"ACT","Major Bank Co.",30,11,4

301,"ACT","Large Telco Inc.",30,0,4

101,"IT","Huge Software Co.",50,0,4

203,"MKT","Basic Insurance Co.",15,0,3

ロードするデータファイル (accounts.dat)

Oracle SQL*Loader コントロールファイル DB2 Load コマンド

Page 35: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

INGESTユーティリティ

シンプルなETL (Extract, Transform, Load) が実現可能

–例1: 基本的なシンタックス

–例2: 固定長データの取り込み

–例3: 取り込んだデータを変換して挿入

35

INGEST FROM FILE my_file.txt FORMAT POSITIONAL(

$field1 POSITION(1:8) INTEGER EXTERNAL,

$field2 POSITION(10:19) DATE ’yyyy-mm-dd’,

$field3 POSITION(25:34) CHAR(10))

INSERT INTO my_tableVALUES($field1, $field2, $field3);

INGEST FROM FILE my_file.txt FORMAT DELIMITED INSERT INTO my_table;

INGEST FROM FILE my_file.txt FORMAT DELIMITED BY ‘|' (

$prod_ID CHAR(8),

$description CHAR(32),

$price DECIMAL(5,2) EXTERNAL,

$sales_tax DECIMAL(4,2) EXTERNAL,

$shipping DECIMAL(3,2) EXTERNAL )

INSERT INTO my_table(prod_ID, description, total_price)

VALUES($prod_id, $description, $price + $sales_tax + $shipping);

Page 36: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

INGESTユーティリティ

UPDATE/MERGE/DELETE等も可能

–例4: キーが一致するレコードの更新

–例5: キーが一致するレコードがあったら更新、なかったら挿入

36

INGEST FROM FILE myfile.txt FORMAT DELIMITED (

$key1 INTEGER EXTERNAL,

$key2 INTEGER EXTERNAL,

$data1 CHAR(8),

$data2 CHAR(32),

$data3 DECIMAL(5,2) EXTERNAL )

UPDATE my_table SET (data1, data2, data3) = ($data1, $data2, $data3)

WHERE (key1 = $key1) AND (key2 = $key2);

INGEST FROM FILE myfile.txt FORMAT DELIMITED (

$key1 INTEGER EXTERNAL,

$key2 INTEGER EXTERNAL,

$data1 CHAR(8),

$data2 CHAR(32),

$data3 DECIMAL(5,2) EXTERNAL )

MERGE INTO my_table

ON (key1 = $key1) AND (key2 = $key2)

WHEN MATCHED THEN UPDATE SET (data1, data2, data3) = ($data1, $data2,

$data3)

WHEN NOT MATCHED THEN INSERT VALUES($key1, $key2, $data1, $data2, $data3);

Page 37: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

• エラー時の処理

o 事前にリスタート表を作成

o 以下のコマンドが失敗したら。。。

o 次のコマンドで再開可能(CONTINUEの代わりにTERMINATEで再開中止)

INGESTユーティリティ(リカバリー機能)

37

INGEST FROM FILE my_file.txt FORMAT DELIMITED (

$field1 INTEGER EXTERNAL,

$field2 DATE 'mm/dd/yyyy',

$field3 CHAR(32) )

RESTART NEW 'ingestjob001'

INSERT INTO my_table VALUES($field1, $field2, $field3);

このDB内でユニークな名前を付ける

INGEST FROM FILE my_file.txt FORMAT DELIMITED (

$field1 INTEGER EXTERNAL,

$field2 DATE 'mm/dd/yyyy',

$field3 CHAR(32) )

RESTART CONTINUE 'ingestjob001'

INSERT INTO my_table VALUES($field1, $field2, $field3);

db2 "CALL SYSPROC.SYSINSTALLOBJECTS('INGEST', 'C', NULL, NULL)"

Page 38: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

アーキテクチャー – 3つのフェーズから構成

• Transporter, Formatter, Flusher • マルチスレッドによる並列処理(Formatter, FlusherはINGEST SETコマンドで スレッド数指定)

– DPF最適化 • データが保存されるパーティションに直接データを投入

その他の機能 –処理状況を表示するモニターコマンド (INGEST LIST, INGEST GET STATS) –コミットのタイミング等、各種設定 (INGEST SET)

INGESTユーティリティ

38

1つまたは複数の ファイル/パイプ

Transporter

Transporter

Flusher Formatter

Formatter

Formatter

Formatter

Flusher

Flusher

SQL

SQL

SQL

マルチスレッド・モデル(1つのINGESTコマンド単位)

DB2

Page 39: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation 39

移行ロードマップ

Page 40: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

移行ロードマップ

40

データベース 移行

アセスメント & PoC

アプリケーション 移行

1. アセスメント & PoC

– 移行対象となる環境についての調査・理解

– 移行ポイントと作業量の見積もり

• 主に机上による変更点の洗い出し(ポーティング・アセスメント) • オプション:一部分を実際に移行して検証(PoC: Proof of Concept)

2. データベース移行

– データベース・オブジェクト(表やPL/SQLなど)の移行

– データの移行

3. アプリケーション移行

– アプリケーションを DB2 用に移行

4. 機能検証

– 一連のテストを実施

自動化

最小限の変更

ツール 正確 迅速

ツール

機能検証

テスト

Page 41: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation 41

移行ツール

Page 42: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

新しい移行ツール: Database Conversion Workbench (DCW)

42

従来のMEETツール、IDMT(IBM Data Movement Tool)ツールを統合

IBM Data Studioにプラグイン

2012年12月現在、DCW 1.0 がリリース

移行ツールの利用効果

–移行計画の精度向上

–移行の一部自動化による移行コスト削減

Page 43: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DCWの機能

DCW 1.0 の主な機能

– DCW Task Launcher

• 統合ヘルプ環境。各処理手順をステップ・バイ・ステップで提供

– DDL Extraction

• OracleのデータベースからDDL定義を抽出

– Compatibility Evaluation and Code Conversion

• 互換率、非互換ポイントの提示と、一部シンタックスの自動変換

– Split DDL

• 1つのDDLファイルをオブジェクト・タイプごとに整理して分割

– Package Visualizer

• オブジェクト間の関係をグラフ表示

– Data Movement

• ソース・データベースからデータを抽出し、ターゲット・データベースにロード

43

Page 44: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DDL

44

DCWを使用した移行の流れ

データ

Package

Visualizer

Data Movement

Oracle DDL 変換されたDDL 分割されたDDL

Compatibility Evaluation and

Code Conversion

DDL Extraction Split DDL

オブジェクト定義情報

Oracle

DB2 for LUW

DCW Task

Launcher Database Conversion Workbench (DCW)

Page 45: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DCWプロジェクト

45

最初にDCWプロジェクトを作成する

Page 46: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DCW Task Launcher

46

Task Launcherで処理したい内容を選択してゆくと、ウィザードが表示される

Page 47: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DDL Extraction

47

以下のステップでDCWプロジェクトにDDLファイルが生成される 1. Extract DDL by creating a custom extraction script

DDLを抽出するためのスクリプトを生成して実行 (.outファイルの生成) 2. Import a DDL file

DCWプロジェクトに抽出したDDLファイル(.out)をインポート(.sqlファイルに変換される)

DDLを抽出するためのスクリプト生成

> sqlplus user/pwd@sid @gen_ddl.sql

スクリプトの実行

DDLファイルのインポート

Page 48: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Compatibility Evaluation and Code Conversion (1/2)

48

自動変換されたDDL、PL/SQL (一部手動変換)

互換率、非互換ポイントの暗号化されたレポート ([email protected] に暗号解除依頼のメール送付)

互換率、非互換ポイントの提示と、一部シンタックスの自動変換

Page 49: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Compatibility Evaluation and Code Conversion (2/2)

49

暗号解除されたレポート

Page 50: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Split DDL

50

1つのDDLファイルをオブジェクト・タイプごとに整理して分割

Page 51: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Package Visualizer (1/2)

51

① 以下の設定を事前に行う • Database connected modeをチェック(データベースに接続して情報を取得) • Database configuration(データベース接続設定)

Offline mode はDCW1.0では未サポート

② DB Objects Explorerビューを表示

オブジェクト間の関係をグラフ表示

Page 52: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Package Visualizer (2/2)

52

③ DB Objects Explorerビューで、参照したいオブジェクトをダブルクリック

Page 53: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Data Movement (1/3)

53

① ターゲット・データベースにDDLを登録

事前にターゲット・データベースにDDLを登録しておき、ソース・データベースからデータを 抽出し、ターゲット・データベースにロード

Page 54: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Data Movement (2/3)

② ソース・データベースのデータをフラット・ファイルに抽出、または、 パイプ経由で直接ターゲット・データベースにロード

54

Page 55: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Data Movement (3/3)

③ソース・データベースのデータをフラット・ファイルに抽出した場合、 フラット・ファイルのデータをターゲット・データベースにロード

55

Page 56: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation 56

※ 主な移行ポイントについて述べており、すべての移行ポイントを網羅 している訳ではありません

※ また、Oracle互換フィーチャーの使用 (DB2_COMPATIBILITY_VECTOR=ORA) を前提としています

Oracleからの移行ポイント

Page 57: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

CREATE TABLEのPCTFREEオプション

PCTFREEは、データの更新時にサイズが増えることを考慮し、挿入時に空きスペースを

あらかじめ確保しておくために利用する

DB2では、ALTER TABLE文でPCTFREEの値をセットしてから、データをロードするか、データの再編成(reorg)を行う

–例

(※) set integrity コマンドは、参照整合性制約等のチェックが必要な場合発行する

57

alter table t1 pctfree 10;

load from data.del of del insert into t1;

set integrity for t1 immediate checked;

Page 58: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Oracleのファンクション索引の移行

58

Oracleのファンクション索引の移行のポイント –ファンクション索引に利用しているファンクションの結果を格納する列を表に追加する –追加する列のデータ・タイプはファンクションの戻りのデータ・タイプに合わせる –ファンクション索引の代わりに、追加した列に対して索引を作成する – generated always as を用い、データの挿入/変更時に自動更新されるようにする – implicitly hiddenを指定して列を隠してもよい

• 隠してもSELECT文で明示的に列名を指定すると参照可能 • 隠さないとINSERT文で各列名を明示的に指定しないとデータが挿入できなくなる

–ファンクションを利用して参照するSQL文の修正は不要(DB2が自動的に索引を選択)

例: – SUBSTR2(C2, 2, 3)で検索する場合

• select .. from … where SUBSTR2(C2, 2, 3)='xxx' –表作成時に定義する場合

• create table [表名] (…, c2 varchar(20), c2_substr varchar(3) generated always as (substr2(c2, 2, 3)) implicitly hidden);

• 上記、追加する列名を C2_SUBSTR としたが、他の列名と異なるなら何でもよい –表が定義されており、列を追加する場合(以下の3つのステップを実行する)

• set integrity for [表名] off; • alter table [表名] add column c2_substr varchar(3) generated always as (substr2(c2,

2, 3)) implicitly hidden; • set integrity for [表名] immediate checked force generated;

–列名を表に追加したら、その列に索引を作成する • create index xxx on [表名] (c2_substr);

Page 59: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

VIEW定義内でのORDER BYの使用

VIEW定義内で ORDER BY を使用している場合、以下のように変換する

– Oracle create view v1 as select … from t1 … order by c1

– DB2 create view v1 as select * from (select … from t1 … order by c1)

59

Page 60: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

ORDER BY xx ASC|DESC NULLS FIRST|LAST

ORDER BYでNULLの扱いを指定している場合、以下のように変換する

– Oracle select … from t1 … order by c1 nulls first

– DB2 select … from t1 … order by row_number() over (order by c1 nulls

first)

• DESC NULLS LAST等も同様に動作

60

Page 61: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

SELECT文の FOR UPDATE の移行

Oracle で SELECT文に FOR UPDATE を付加している場合

– DB2では WITH RS を付ける。複数の表が対象の場合は、WITH RS USE AND KEEP

UPDATE LOCKS に変換する

– Oracle select … from t1 where … for update;

– DB2 select … from t1 where … for update with rs;

select … from t1, t2 where … with rs use and keep update locks;

61

Page 62: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

SELECT文の NOWAIT の移行

Oracleで SELECT文に NOWAIT を付加している場合

– DB2ではSELECT文の前に TIMEOUT設定を変える "SET CURRENT LOCK TIMEOUT"

ステートメントを発行し、SELECT文の発行後に、設定を元に戻す

– Oracle select … from t1 where … for update nowait;

– DB2 set current lock timeout not wait;

select … from t1 where … for update with rs;

set current lock timeout null;

※ set 文は、発行したセッションでのみ設定が変更されるので、

他のセッションへの影響なし

タイムアウト時の動作

–タイムアウトすると、トランザクションがロールバックされる(デフォルトの動作)

–発行したSELECT文のみエラーとする場合、以下の設定を行う db2set DB2LOCK_TO_RB=STATEMENT

※ DB2インスタンス・レベルでの設定となるため、影響範囲がインスタンス全体に渡る

62

Page 63: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DB2のロック・タイムアウト設定

デフォルトは、DB構成パラメーター LOCKTIMEOUT の値が使用される

※ -1 はデフォルトでロック・タイムアウトなし

SET CURRENT LOCK TIMEOUT ステートメントには、待ち時間をセットすることも可能

参照URL: SET CURRENT TIMEOUT – http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0011874.html

63

$ db2 get db cfg for [DB名] … ロック・タイムアウト (秒) (LOCKTIMEOUT) = -1 …

Page 64: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

LENGTH / LENGTHB 関数の移行

OracleのLENGTH/LENGTHB関数の仕様

DB2への移行時、以下のように変換する

64

Oracleの関数名 仕様

LENGTH('文字列') 文字列の文字数を返す

LENGTHB('文字列') 文字列のバイト数を返す

Oracleの関数名 DB2の関数名

LENGTH('文字列') LENGTH('文字列', CODEUNITS32)

LENGTHB('文字列') LENGTH('文字列') または

LENGTH('文字列', OCTETS)

Page 65: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

SUBSTR / INSTR 関数の移行

DB2への移行時、以下のように変換する

※ SUBSTR2(…)は、CODEUNITS16で処理 (JIS第3,4水準を使用していなければCODEUNITS16でも問題なし)

SUBSTRB / INSTRB 関数はOracleと同じなので、変換不要

65

Oracleの関数名 DB2の関数名

SUBSTR(…) SUBSTR2(…) ※ または、

SUBSTRING('文字列', x, y, CODEUNITS32)

INSTR('文字列', '検索文字列')

INSTR('文字列', '検索文字列', x)

INSTR('文字列', '検索文字列', x, y)

INSTR('文字列', '検索文字列', 1, 1, CODEUNITS32)

INSTR('文字列', '検索文字列', x, 1, CODEUNITS32)

INSTR('文字列', '検索文字列', x, y, CODEUNITS32)

Page 66: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

TO_CHAR 関数の移行

数値、日付等を文字列の指定の書式にフォーマットする

数値フォーマットのFM等、異なる点があるので確認が必要(FMは以下のように変換する)

– Oracleの例

– DB2の例(最初の例はOracleと同じなので変換不要)

参照URL: VARCHAR_FORMAT関数 (= TO_CHAR関数) – http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0007110.html

66

OracleのTO_CHAR 結果

TO_CHAR(-1234.56, '9,999,999.99') ' -1,234.56'

TO_CHAR(-1234.56, 'FM9,999,999.99') '-1,234.56'

DB2のTO_CHAR 結果

TO_CHAR(-1234.56, '9,999,999.99') ' -1,234.56'

TRIM(TO_CHAR(-1234.56, '9,999,999.99')) '-1,234.56'

Page 67: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

SYSTIMESTAMPの移行

OracleのSYSTIMESTAMPは、CURRENT TIMESTAMPに置き換える

– Oracleの使用例 select TO_CHAR(SYSTIMESTAMP, 'YYYY/MM/DD HH24:MI:SS') from

dual;

– DB2への変換 select TO_CHAR(CURRENT TIMESTAMP, 'YYYY/MM/DD HH24:MI:SS')

from dual;

SYSDATEはDB2でも使用可能 (CURRENT DATE と同じ)

67

Page 68: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DBMS_APPLICATION_INFO および V$SESSION の移行(1/2)

クライアント情報を付加して、セッション(アプリケーション)情報と関連付ける

DB2では、以下の情報を付加できる

– ApplicationName, ClientAccountingInformation, ClientHostname, ClientUser

Javaでの付加

– ConnectionオブジェクトのsetClientInfoメソッドの利用

– 参照URL

• http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.apdv.java.doc/src/tpc/imjcc_t0052428.html

プロシージャーでの付加

– WLM_SET_CLIENT_INFOプロシージャーの利用

– 参照URL

• http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.sql.rtn.doc/doc/r0053116.html

68

DataSource ds = (DataSource)ctx.lookup("java:/comp/env/jdbc/xxx"); Connection con = ds.getConnection(); con.setClientInfo("ClientUser", "User1"); con.setClientInfo("ApplicationName", "My Java Application1");

db2 => call WLM_SET_CLIENT_INFO('User2', null, 'My CLP2', null, null); リターン状況 = 0

Page 69: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

DBMS_APPLICATION_INFO および V$SESSION の移行(2/2)

アプリケーション情報の取得

– SYSIBMADM.SNAPAPPL_INFO管理ビューの利用

69

db2 => select agent_id,

substr(appl_name,1,20) appl_name,

substr(appl_id,1,30) appl_id,

substr(tpmon_client_userid,1,10) tpmon_client_userid,

substr(tpmon_client_app,1,25) tpmon_client_app

from sysibmadm.snapappl_info;

AGENT_ID APPL_NAME APPL_ID TPMON_CLIENT_USERID TPMON_CLIENT_

APP

-------- -------------------- ------------------------------ ------------------- -------------

------------

344 db2bp.exe *LOCAL.DB2.120911234210 - -

311 db2bp.exe *LOCAL.DB2.120911232102 User2 My CLP2

317 db2fw1 *LOCAL.DB2.120911232110 - -

323 db2jcc_application 127.0.0.1.50469.120911232312 User1 My Java Appli

cation1

316 db2fw0 *LOCAL.DB2.120911232109 - -

...

db2 => list application;

Auth Id Application Appl. Application Id DB # of

Name Handle Name Agents

-------- -------------- ---------- ---------------------------------------- -------- -----

MOHKAWA db2bp.exe 344 *LOCAL.DB2.120911234210 SAMPLE 1

MOHKAWA db2bp.exe 311 *LOCAL.DB2.120911232102 SAMPLE 1

MOHKAWA db2jcc_applica 323 127.0.0.1.50469.120911232312 SAMPLE 1

Page 70: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

PL/SQL: ブロック内での型宣言

DB2 10 で対応されたので変換の必要なし

(DB2 9.7 までは PL/SQL のパッケージ定義で宣言)

例:

– Oracle & DB2

70

create or replace function func1(i in number) return varchar2

is

type type1 is record (

c1 number,

c2 varchar2(10));

type arr_type1 is table of type1 index by binary_integer;

type arr_type2 is varray(5) of varchar(10);

t1_arr arr_type1;

t2_arr arr_type2;

begin

t1_arr(1).c1 := i;

t1_arr(1).c2 := 'hello';

t1_arr(2).c1 := i + 1;

t1_arr(2).c2 := 'ciao';

t2_arr(1) := 'cava';

t2_arr(2) := 'ola';

return t1_arr(1).c2 || t1_arr(1).c1 || ', ' || t1_arr(2).c2

|| t1_arr(2).c1 || ', ' || t2_arr(1) || ', ' || t2_arr(2);

end;

Page 71: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

PL/SQL: ブロック内でのFUNCTION宣言

ブロック内でのFUNCTION宣言は、PROCEDURE宣言に書き換える

(DB2 10で対応。DB2 9.7 までは PL/SQL のパッケージに変換)

例:

– Oracle

– DB2

71

create or replace function func1(i in number) return number is

function sub1 (j in number) return number is

begin

return j + 100;

end;

begin

return sub1(i);

end;

create or replace function func1(i in number) return number is

i2 number;

procedure sub1 (j in number, j2 out number) is

begin

j2 := j + 100;

end;

begin

sub1(i, i2);

return i2;

end;

Page 72: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

PL/SQL: CURSORの宣言

Oracleでは、CURSOR定義内で、そのFUNCTION/PROCEDUREで宣言したパラメータが使用可能

DB2

– DB2の場合、CURSOR定義内で使用できる変数は、そこに渡された引数のみ

–上記の場合、p1 変数を使用することはできない。以下のようなエラーとなる

• SQL0206N 使用されているコンテキストで、"P1"は無効です。

– p1 変数も使用する場合、以下のように、引数として渡す

72

FUNCTION xxx(…) RETURN xxx IS

p1 VARCHAR2;

CURSOR c1(a1 VARCHAR2, a2 VARCHAR2) IS

SELECT … FROM … WHERE xxx = p1 and yyy = a1 and zzz = a2;

FUNCTION xxx(…) RETURN xxx IS

p1 VARCHAR2;

CURSOR c1(a1 VARCHAR2, a2 VARCHAR2, p1 VARCHAR2) IS

SELECT … FROM … WHERE xxx = p1 and yyy = a1 and zzz = a2;

Page 73: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

RETURNING INTO は、DELETE/INSERT/UPDATEにより削除/挿入/更新された行を戻す

Oracleでは、BULK COLLECTと組み合わせることで複数行を得ることができる

DB2では、NEW TABLE関数(※)(INSERT/UPDATE時)、OLD TABLE関数(DELETE時)を利用

※ トリガー使用時、トリガー処理後のデータを得る場合、FINAL TABLE関数を利用

– Oracle

– DB2

PL/SQL: RETURNING INTOにおけるBULK COLLECTの利用

73

declare

type t1row is record ( n number,

c varchar2(10) );

type t1row_array is varray(10) of t1row;

rows t1row_array;

begin

update t1 set c2='hello' where c1>=100

returning c1,c2 bulk collect into rows;

...

end;

declare

type t1row is record ( n number,

c varchar2(10) );

type t1row_array is varray(10) of t1row;

rows t1row_array;

begin

select c1,c2 bulk collect into rows from

new table(update t1 set c2='hello' where c1>=100);

...

end;

Page 74: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

PL/SQL: ROLLBACK時のCURSORの保持

DB2ではROLLBACKするとCURSORはクローズされる(COMMITでは保持される)

ROLLBACK後もCURSORを保持したい場合は、以下のようにSAVEPOINTを利用する

74

<<cur1_loop>> loop fetch cur1 into x1, x2 exit when cur1%notfound; … rc := 0; begin … exception when … then rc := -1; end; if rc != 0 then rollback; goto cur1_loop; end if; commit; end loop cur1_loop; close cur1;

Oracle DB2

<<cur1_loop>> loop fetch cur1 into x1, x2; exit when cur1%notfound; savepoint sp1 on rollback retain cursors; … rc := 0; begin … exception when … then rc := -1; end; if rc != 0 then rollback to savepoint sp1; goto cur1_loop; end if; commit; end loop cur1_loop; close cur1;

Page 75: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

PL/SQL: DBMS_SQLパッケージ

DEFINE_COLUMN / COLUMN_VALUE プロシージャー

–使用するデータタイプに応じたプロシージャーに書き換える • 例:

DBMS_SQL.DEFINE_COLUMN_VARCHAR(cur, 1, c1, 16);

DBMS_SQL.COLUMN_VALUE_VARCHAR(cur, 1, c1);

DBMS_SQL.xxx_TABLE タイプ (例: DBMS_SQL.VARCHAR2_TABLE)

– DB2では、暗黙的に定義されていないので、使用前に以下のような定義を行う

TYPE VARCHAR2_TABLE IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;

75

Page 76: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

JDBCの移行

DB2 JDBCドライバーが含まれる JAR ファイルをCLASSPATH環境変数に追加 – sqllib/java ディレクトリー下にある以下のファイルのうち、1つを追加

– db2jcc4.jar(JDBC 4.0 以降の機能、および、JDBC 3.0 以前の機能をサポート)

– db2jcc.jar (JDBC 3.0 以前の機能のみサポート)

JDBCドライバー・クラス名および接続URLの変更

– Oracle • JDBCドライバー・クラス名: oracle.jdbc.OracleDriver

• 接続URLフォーマット(ユーザー名/パスワードなし) jdbc:oracle:thin:@[ホスト名]:[ポート番号]:[SID]

• 接続URLフォーマット(ユーザー名/パスワード付) jdbc:oracle:thin:[ユーザー名]/[パスワード]@[ホスト名]:[ポート番号]:[SID]

– DB2 • JDBCドライバー・クラス名: com.ibm.db2.jcc.DB2Driver

• 接続URLフォーマット(ユーザー名/パスワードなし) jdbc:db2://[ホスト名]:[ポート番号]/[DB名]

• 接続URLフォーマット(ユーザー名/パスワード付) jdbc:db2://[ホスト名]:[ポート番号]/[DB名]:user=[ユーザー名];password=[パスワード];

76

Page 77: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

SQL文をプログラムに埋め込む

プリコンパイラーを使用して、C言語に変換

Pro*Cの移行

77

EXEC SQL BEGIN DECLARE SECTION; char user[20], password[20], dbname[9]; int c1; char c2[11]; EXEC SQL END DECLARE SECTION; strcpy(user, "scott"); strcpy(password, "xxx"); strcpy(dbname, "orcl"); /* データベースへの接続 */ EXEC SQL CONNECT :user IDENTIFIED BY :password USING :dbname; /* カーソル宣言 */ EXEC SQL DECLARE cur CURSOR FOR SELECT C1, C2 FROM T1; /* カーソルのオープン */ EXEC SQL OPEN cur; for (;;) { /* レコードの取得(フェッチ) */ EXEC SQL FETCH cur INTO :c1, :c2; if (sqlca.sqlcode == 1403) break; printf("%d %s¥n", c1, c2); } /* カーソルのクローズ */ EXEC SQL CLOSE cur; /* コミットして切断 */ EXEC SQL COMMIT WORK RELEASE;

プログラム例

Page 78: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Pro*Cの移行(組み込みSQL)

DB2では組み込みSQLが、OracleのPro*Cに相当

SQL文の実行形式

– DB2とOracleともに、1つの静的SQL(※)実行方法と、4つの動的SQL実行方法がある

(※) 静的SQLについては次ページ参照

組み込みSQLの仕様(Pro*Cとの違い)

–データベースに接続して、プリコンパイルを行う(埋め込まれたSQL文の検証)

–プログラム実行前に、そのパッケージ(※)をデータベースにバインドしておく

–パッケージ(※)のバインド

• 埋め込まれた静的SQL文の実行計画(アクセス・プラン)の生成と保持

• プログラム実行時は、保持されたアクセス・プランに基づいて実行

(バインド時のオプションにより、動的SQLのように扱うこともできる)

※ Oracleのパッケージとは意味が違うので要注意

互換フィーチャー

–プリコンパイル・オプション COMPATIBILITY_MODE ORA をセットする

典型的なプリコンパイル・シンタックス prep prog1.sqc bindfile package using prog1 compatibility_mode ora

参照URL: 移行の互換フィーチャーの使用可能化 – http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.apdv.embed.doc/doc/c0059083.html

78

Page 79: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

組み込みSQLプログラムと静的SQL

79

静的SQLはSQL文を直接プログラムに書く(動的SQLは変数にSQL文をセットする)

DB2の静的SQL –バインド、またはリバインドした時に、SQL文の実行計画(アクセス・プラン)が生成され、データベースに作成されたパッケージ・オブジェクトに保持される

–実行時は、パッケージに保存されているアクセス・プランに従って実行される • アクセス・プランを動的に作成する必要なし

組み込みSQLプログラム開発・実行の流れ(C言語用の場合)

組み込みSQLプログラム(xxx.sqc)

C言語用プログラム(xxx.c) バインド・ファイル(xxx.bnd)

パッケージ (静的SQLのアクセス・

プランを含む)

実行形式プログラム

プリコンパイル(DB2 PRECOMIILE …)

コンパイル バインド リバインド

静的SQLのアクセス・プランの生成・再生成

Page 80: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

組み込みSQLプログラムにおけるマクロ

マクロの使用(例: #ifdefの使用, 配列の要素数をラベルで定義)

– DB2もOracleもサポート

– DB2は別のコンパイラのプリプロセッサを利用(オプションで指定) prep prog1.sqc bindfile package using prog1

preprocessor "xlC -P -DDB2=1" COMPATIBILITY_MODE ORA

※ AIXのコンパイラ xlC を使用した場合の例

80

#ifdef ORA

sqlglm(emsg, &buf_len, &emsg_len);

printf("%.*s¥n", emsg_len, emsg);

#elif DB2

sqlaintp(emsg, sizeof(emsg), 0, &sqlca);

printf("%s¥n", emsg);

#endif

マクロ使用例(含エラーメッセージ取得APIの違い)

Page 81: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Pro*Cプログラム

81

DB2の組み込みSQLプログラムに移行

SQLの実行形式 –静的SQL:DB2とOracleでほぼ同じ

例 EXEC SQL DECLARE cur CURSOR FOR SELECT C1, C2 FROM T1; EXEC SQL OPEN cur; EXEC SQL FETCH cur INTO :c1, :c2;

–動的SQL • 方法1: DB2とOracleでほぼ同じ

SQL文の実行 EXEC SQL EXECUTE IMMEDIATE :sql;

• 方法2: DB2とOracleでほぼ同じ SQL文の実行(入力ホスト変数をセット可能)

EXEC SQL PREPARE stmt FROM :sql; EXEC SQL EXECUTE stmt USING :p1, :p2;

• 方法3: DB2とOracleでほぼ同じ SQL文の実行(入力ホスト変数をセット可能、結果列の値を取得可能)

EXEC SQL PREPARE stmt FROM :sql; EXEC SQL DECLARE cur CURSOR FOR stmt; EXEC SQL OPEN cur USING :p1, :p2; EXEC SQL FETCH cur INTO :c1, :c2;

• 方法4: 入力ホスト変数の数、結果の列数等が動的に構成可能 指定はSQLDA構造体を使用。SQLDA構造体がDB2とOracleで違う

Page 82: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation 82

Pro*C: プログラムの変換例

/* データベースへの接続 */

EXEC SQL CONNECT :user IDENTIFIED BY :password USING :dbname;

/* カーソル宣言 */

EXEC SQL DECLARE cur CURSOR FOR SELECT C1, C2 FROM T1;

/* カーソルのオープン */

EXEC SQL OPEN cur;

for (;;) {

/* レコードの取得(フェッチ) */

EXEC SQL FETCH cur INTO :c1, :c2;

#ifdef ORA

if (sqlca.sqlcode == 1403) {

#elif DB2

if (sqlca.sqlcode == 100) {

#endif

break;

}

printf("%d %s¥n", c1, c2);

}

/* カーソルのクローズ */

EXEC SQL CLOSE cur;

/* コミットして切断 */

#ifdef ORA

EXEC SQL COMMIT WORK RELEASE;

#elif DB2

EXEC SQL COMMIT;

EXEC SQL CONNECT RESET;

#endif

プログラム例 プリコンパイラーオプション COMPATIBILITY_MODE ORA で対応

この例では、2箇所の書き換えが必要

DB2本来のシンタックスは、 EXEC SQL CONNECT TO :dbname USER :user USING :password;

Page 83: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Pro*C: VARCHAR構造体について(char型の利用との違い)(1/2)

VARCHAR param[x] は、Oracle互換モードで、以下の構造体に変換され、OracleのPro*Cプログラムがそのまま利用できる

VARCHAR型でDB2サーバーとデータをやり取りする場合

– この変数を使用してSQL文で戻されるデータを受けると、arrに文字列の値(NULLターミネーターなし)、lenにその長さがセットされる。

– この変数に値をセットしてDB2サーバーとやり取りする場合も、上記のようにセットする。

char型でDB2サーバーとデータをやり取りする場合

– char型の変数を使用してSQL文で戻されるデータを受けると、文字列の値をNULLターミネーター付きでセットする。

• NULLターミネーターがセットされるため、1バイト余計に変数の領域を確保する

例(T1表の定義: create table t1 (c1 int, c2 varchar2(10)))

83

struct {

short len;

char arr[x];

} param;

int c1;

VARCHAR c2_1[10];

char c2_2[10+1];

EXEC SQL DECLARE cur CURSOR FOR SELECT C1, C2, C2 FROM T1;

EXEC SQL FETCH cur INTO :c1, :c2_1, :c2_2;

printf("c2_1=%.*s¥n", c2_1.len, c2_1.arr);

printf("c2_2=%s¥n", c2_2);

NULLターミネートされない

NULLターミネートされる

Page 84: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Pro*C: VARCHAR構造体について(char型の利用との違い)(2/2)

Oracleの場合、列のデータ・タイプがVARCHAR2であっても、C言語のchar型でデータを受信すると、値は固定長となり、足りない文字はスペースが入り、NULLターミネーターが付く(必ず文字列の長さが列のデータ・タイプの長さとなり、NULLターミネーターが付く)

DB2の場合、列のデータ・タイプがVARCHAR(VARCHAR2)なら、C言語のchar型でデータを受信すると、その値がそのままセットされ、NULLターミネーターが付く

84

VARCHAR2(10)

'hello'

'ciao˽˽'

VARCHAR2(10)

'hello'

'ciao˽˽'

OracleのPro*Cプログラム

char型でデータを取得すると

"hello˽˽˽˽˽"

"ciao˽˽˽˽˽˽"

DB2の組み込みSQLプログラム

char型でデータを取得すると

"hello"

"ciao˽˽"

Oracle

DB2

Page 85: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Pro*C: 構造体を用いたデータ取得(NULLチェック方法)

Oracle, DB2ともに、複数の列のデータをC言語の構造体で取得することが可能

NULLかどうかチェックするためのインジケータの指定方法が異なる

85

EXEC SQL BEGIN DECLARE SECTION;

char user[20], password[20], dbname[9];

typedef struct {

int c1;

char c2[11];

} T1;

T1 t1;

typedef struct {

short c1;

short c2;

} T1_IND;

T1_IND t1_ind;

EXEC SQL END DECLARE SECTION;

EXEC SQL DECLARE cur CURSOR FOR

SELECT C1, C2 FROM T1;

EXEC SQL FETCH cur INTO :t1 :t1_ind;

if (t1_ind.c1 == -1) {

/* C1がNULLの場合の処理 */

}

if (t1_ind.c2 == -1) {

/* C2がNULLの場合の処理 */

}

EXEC SQL BEGIN DECLARE SECTION;

char user[20], password[20], dbname[9];

typedef struct {

int c1;

char c2[11];

} T1;

T1 t1;

short t1_ind[2];

EXEC SQL END DECLARE SECTION;

EXEC SQL DECLARE cur CURSOR FOR

SELECT C1, C2 FROM T1;

EXEC SQL FETCH cur INTO :t1 :t1_ind;

if (t1_ind[0] == -1) {

/* C1がNULLの場合の処理 */

}

if (t1_ind[1] == -1) {

/* C2がNULLの場合の処理 */

}

Oracle DB2

Page 86: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Pro*C: FETCH … INTO のデータなし処理

データなしのエラー番号が違う(Oracleの場合:1403, DB2の場合:100)

– DB2では以下のようなプログラムになる

EXEC SQL WHENEVER NOT FOUND DO BREAK文で抜けることも可能

–終了したら EXEC SQL WHENEVER NOT FOUND CONTINUE を発行する

86

while (1) {

EXEC SQL FETCH …;

if (sqlca.sqlcode == 100) {

break;

}

… sqlca.sqlcode は SQLCODE と置き換えることも可能

例:

if (SQLCODE == 100) {

EXEC SQL WHENEVER SQLERROR GOTO SqlErrorTerminate;

EXEC SQL WHENEVER NOT FOUND DO BREAK;

while (1) {

EXEC SQL FETCH …;

}

EXEC SQL WHENEVER NOT FOUND CONTINUE;

EXEC SQL WHENEVER SQLERROR CONTINUE;

Page 87: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation

Pro*C: ストアード・プロシージャー呼び出し

DB2では、EXEC SQL CALL文で対応

無名ブロック(begin … end) を使用する場合、動的SQLにする

Oracleの例

–以下のようにプロシージャーの第1,3引数を入力, 第2,4引数を出力とする

DB2: EXEC SQL CALL文で対応する場合

DB2: 無名ブロックを使用する場合

87

EXEC SQL EXECUTE

begin

proc1(:in1, :out1, :in2, :out2);

end;

END-EXEC;

EXEC SQL CALL proc1(:in1, :out1, :in2, :out2);

char stmt[256];

strcpy(stmt, "begin proc1(:in1, :out1, :in2, :out2); end;");

EXEC SQL PREPARE sql FROM :stmt;

EXEC SQL EXECUTE sql into :in1, :out1, :in2, :out2 using :in1,

:out1, :in2, out2;

動的SQL内の:変数は、? としてもよい

例:

begin proc1(?, ?, ?, ?); end;

引数が入力か出力かに関係なく、順に定義する

Page 88: OracleからDB2 10 への移行 - IBM Support and …public.dhe.ibm.com/software/dw/jp/data/library/db2/j_d...PL/SQL Transact-SQL DB2 の SQL/PL (SQL/PSM に基づく) アプリケーションが、選択した

© 2013 IBM Corporation 88

© IBM Corporation 2013. All Rights Reserved. ワークショップ、セッション、および資料は、IBMまたはセッション発表者によって準備され、それぞれ独自の見解を反映したものです。それらは情報提供の目的のみで提供されており、いかなる参加者に対しても法律的またはその他の指導や助言を意図したものではなく、またそのような結果を生むものでもありません。本プレゼンテーションに含まれている情報については、完全性と正確性を帰するよう努力しましたが、「現状のまま」提供され、明示または暗示にかかわらずいかなる保証も伴わないものとします。本プレゼンテーションまたはその他の資料の使用によって、あるいはその他の関連によって、いかなる損害が生じた場合も、IBMは責任を負わないものとします。 本プレゼンテーションに含まれている内容は、IBMまたはそのサプライヤーやライセンス交付者からいかなる保証または表明を引きだすことを意図したものでも、IBMソフトウェアの使用を規定する適用ライセンス契約の条項を変更することを意図したものでもなく、またそのような結果を生むものでもありません。 本プレゼンテーションでIBM製品、プログラム、またはサービスに言及していても、IBMが営業活動を行っているすべての国でそれらが使用可能であることを暗示するものではありません。本プレゼンテーションで言及している製品リリース日付や製品機能は、市場機会またはその他の要因に基づいてIBM独自の決定権をもっていつでも変更できるものとし、いかなる方法においても将来の製品または機能が使用可能になると確約することを意図したものではありません。本資料に含まれている内容は、参加者が開始する活動によって特定の販売、売上高の向上、またはその他の結果が生じると述べる、または暗示することを意図したものでも、またそのような結果を生むものでもありません。 パフォーマンスは、管理された環境において標準的なIBMベンチマークを使用した測定と予測に基づいています。ユーザーが経験する実際のスループットやパフォーマンスは、ユーザーのジョブ・ストリームにおけるマルチプログラミングの量、入出力構成、ストレージ構成、および処理されるワークロードなどの考慮事項を含む、数多くの要因に応じて変化します。したがって、個々のユーザーがここで述べられているものと同様の結果を得られると確約するものではありません。 記述されているすべてのお客様事例は、それらのお客様がどのようにIBM製品を使用したか、またそれらのお客様が達成した結果の実例として示されたものです。実際の環境コストおよびパフォーマンス特性は、お客様ごとに異なる場合があります。 以下は、International Business Machines Corporationの米国およびその他の国における商標。IBMの全商標のリストについては、 www.ibm.com/legal/copytrade.shtmlをご覧ください。 AIX, CICS, CICSPlex, DB2, DB2 Universal Database, i5/OS, IBM, the IBM logo, IMS, iSeries, Lotus, OMEGAMON, OS/390, Parallel Sysplex, pureXML, Rational, RCAF, Redbooks, Sametime, Smart SOA, System i, System i5, System z , Tivoli, WebSphere, z/OS. JavaおよびすべてのJava関連の商標およびロゴは Sun Microsystems, Inc.の米国およびその他の国における商標。 Microsoft, Windows, Windows NT および Windowsロゴは Microsoft Corporationの米国およびその他の国における商標。 Intel, Intelロゴ, Intel Inside, Intel Insideロゴ, Intel Centrino, Intel Centrinoロゴ, Celeron, Intel Xeon, Intel SpeedStep, Itanium, Pentium は Intel Corporationまたは子会社の米国およびその他の国における商標または登録商標。 UNIXはThe Open Groupの米国およびその他の国における登録商標。 Linuxは、Linus Torvaldsの米国およびその他の国における商標。 その他の会社名、製品名およびサービス名等はそれぞれ各社の商標。