[Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle...

24
[Lab 3] [Lab 3] [Lab 3] [Lab 3] Oracle Oracle Oracle Oracle からの からの からの からの移行 移行 移行 移行を促進 促進 促進 促進 する する する する新機能 新機能 新機能 新機能 2009 2009 2009 2009 年 12 12 12 12 月 日本 日本 日本 日本アイ アイ アイ アイ・ビー ビー ビー ビー・エム エム エム エム株式会社 株式会社 株式会社 株式会社

Transcript of [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle...

Page 1: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

[Lab 3] [Lab 3] [Lab 3] [Lab 3]

OracleOracleOracleOracle からのからのからのからの移行移行移行移行をををを促進促進促進促進

するするするする新機能新機能新機能新機能

2009200920092009 年年年年 12121212 月月月月

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

Page 2: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

2

Contents

CONTENTS ..........................................................................................................2

1.1.1.1. はじめにはじめにはじめにはじめに .........................................................................................................3

2.2.2.2. 内容内容内容内容 ...............................................................................................................3

3.3.3.3. レジストリレジストリレジストリレジストリ変数変数変数変数のののの設定設定設定設定ととととデータベースデータベースデータベースデータベースのののの作成作成作成作成 .....................................................3

3.1 レジストリ変数なしでのデータベースの作成 ................................................3

3.2 レジストリ変数ありでのデータベースの作成 ................................................4

3.3 データタイプの互換性パラメーターの確認 ...................................................5

4.4.4.4. ORACLEORACLEORACLEORACLE 固有固有固有固有ののののデータデータデータデータ・・・・タイプタイプタイプタイプのののの使用使用使用使用 ..............................................................6

4.1 互換機能が無効なデータベースでの使用 ...................................................6

4.2 互換機能が有効なデータベースでの使用 ...................................................7

4.3 データの挿入と参照 .................................................................................7

5.5.5.5. ORACLEORACLEORACLEORACLE 互換互換互換互換ののののビルトインビルトインビルトインビルトイン関数関数関数関数のののの使用使用使用使用.............................................................9

6. PL/SQL のののの無名無名無名無名ブロックブロックブロックブロックのののの実行実行実行実行 ...................................................................11

7.7.7.7. PL/SQLPL/SQLPL/SQLPL/SQL パッケージパッケージパッケージパッケージのののの作成作成作成作成とととと実行実行実行実行 ..................................................................13

7.1 PL/SQL パッケージの作成 .......................................................................13

7.2 パッケージの実行 ....................................................................................15

8.8.8.8. 新新新新しいしいしいしいロックロックロックロック方式方式方式方式((((CURRENTLY COMMITTEDCURRENTLY COMMITTEDCURRENTLY COMMITTEDCURRENTLY COMMITTED))))のののの確認確認確認確認 ....................................17

8.1 パラメーターの無効化 ..............................................................................17

8.2 テスト準備 ...............................................................................................18

8.3 Currently Commited の動作の確認...........................................................19

Page 3: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

3

1111.... はじめにはじめにはじめにはじめに

このハンズオンでは、Oracle 互換機能のいくつかの機能を実際に実行し、これらの機能の理

解を深めます。

2222.... 内容内容内容内容

このハンズオンでは以下の内容を実施します。

� レジストリ変数の設定とデータベースの作成

� Oracle 固有のデータ・タイプの使用

� Oracle 互換のビルトイン関数の使用

� PL/SQL の無名ブロックの実行

� PL/SQL パッケージの作成と実行

� 新しいロック方式(CURRENTLY COMMITED)の確認

3333.... レジストリレジストリレジストリレジストリ変数変数変数変数のののの設定設定設定設定ととととデータベースデータベースデータベースデータベースのののの作成作成作成作成

3333....1111 レジストリレジストリレジストリレジストリ変数変数変数変数なしでのなしでのなしでのなしでのデータベースデータベースデータベースデータベースのののの作成作成作成作成

_データベースの作成

最初にレジストリ変数 DB2_COMPATIBILITY_VECTOR を設定していない状態でデータベース

を作成します。

Terminal を開き、db2inst1 ユーザーで以下のコマンドを実行し、データベースを作成します。

コマンド

db2 create db oratest1 on /db2 using codeset utf-8 territory

jp

実行例

db2inst1@db2V97onSLES10:~> db2 create db oratest1 on /db2 using codeset utf-8 territory jp

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

Page 4: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

4

3333....2222 レジストリレジストリレジストリレジストリ変数変数変数変数ありでのありでのありでのありでのデータベースデータベースデータベースデータベースのののの作成作成作成作成

_レジストリ変数の設定

次にレジストリ変数 DB2_COMPATIBILITY_VECTOR=ORA を設定した状態でデータベースを作

成します。レジストリ変数 DB2_COMPATIBILITY_VECTOR=ORA と同時に

DB2_DEFERRED_PREPARE_SEMANTICS=YES の設定も行います。

Terminal を開き、db2inst1 ユーザーで以下のコマンドを実行します。

レジストリ変数の設定後、インスタンスの再起動も行います。

コマンド:

db2set DB2_COMPATIBILITY_VECTOR=ORA

db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES

db2stop force

db2start

db2set –all

実行例

_データベースの作成

レジストリ変数の設定後、データベースの作成を行います。

以下のコマンドを、db2inst1 ユーザーで実行します。

コマンド

db2 create db oratest2 on /db2 using codeset utf-8 territory jp

実行例

db2inst1@db2V97onSLES10:~> db2set DB2_COMPATIBILITY_VECTOR=ORA

db2inst1@db2V97onSLES10:~> db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES

db2inst1@db2V97onSLES10:~> db2stop force

2009-08-06 20:55:35 0 0 SQL1064N DB2STOP の処理が正常に終了しました。

SQL1064N DB2STOP の処理が正常に終了しました。

db2inst1@db2V97onSLES10:~> db2start

08/06/2009 20:55:40 0 0 SQL1063N DB2START の処理が正常に終了しました。

SQL1063N DB2START の処理が正常に終了しました。

db2inst1@db2V97onSLES10:~> db2set -all

[i] DB2_DEFERRED_PREPARE_SEMANTICS=YES

[i] DB2_COMPATIBILITY_VECTOR=ORA

[i] DB2COMM=tcpip

[g] DB2SYSTEM=db2V97onSLES10

[g] DB2INSTDEF=db2inst1 db2inst1@db2V97onSLES10:~>

db2inst1@db2V97onSLES10:~> db2 create db oratest2 on /db2 using codeset utf-8 territory jp

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

Page 5: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

5

3333....3333 データタイプデータタイプデータタイプデータタイプのののの互換性互換性互換性互換性パラメーターパラメーターパラメーターパラメーターのののの確認確認確認確認

_データベース構成パラメーターの確認

データベースの作成後、ORATEST1 と ORATEST2 のデータベース構成パラメーターを確認し

ます。データ・タイプの互換性機能のパラメーターを確認します。

以下のコマンドを、db2inst1 ユーザーで実行します。

コマンド

db2 get db cfg for oratest1 | grep 互換性

db2 get db cfg for oratest2 | grep 互換性

実行例

レジストリ変数 DB2_COMPATIBILITY_VECTOR を設定する前に作成したデータベース

ORATEST1 では、データ・タイプの互換性に関連するパラメーターが OFF になっていることが

確認できます。

レジストリ変数 DB2_COMPATIBILITY_VECTOR=ORA を設定後に作成したデータベース

ORATEST2 では、データ・タイプの互換性に関連するパラメーターが ON になっていることが確

認できます。

db2inst1@db2V97onSLES10:~> db2 get db cfg for oratest1 | grep 互換性

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

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

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

db2inst1@db2V97onSLES10:~> db2 get db cfg for oratest2 | grep 互換性

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

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

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

Page 6: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

6

4444.... OracleOracleOracleOracle 固有固有固有固有ののののデータデータデータデータ・・・・タイプタイプタイプタイプのののの使用使用使用使用

4444....1111 互換機能互換機能互換機能互換機能がががが無効無効無効無効ななななデータベースデータベースデータベースデータベースでのでのでのでの使用使用使用使用

_表の作成の失敗

Oracle 固有のデータ・タイプである、VARCHAR2 型、NUMBER 型、DATE 型の列を持つ表を

ORATEST1、ORATEST2 に作成します。

最初に ORATEST1 データベースに接続して、CREATE TABLE 文を実行します。

以下のコマンドを実行します。

コマンド

db2 connect to oratest1

db2 “create table t1(c1 varchar2(10),c2 number(10,2),c3

date)”

実行例

データ・タイプの互換性のパラメーターが OFF のため VARCHAR2 型や NUMBER 型の列を持

つ表の作成に失敗します。VARCHAR2 型や NUMBER 型が認識されないため、文法エラー

(SQL0104N)となります。

db2inst1@db2V97onSLES10:~> db2 connect to oratest1

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST1

db2inst1@db2V97onSLES10:~> db2 "create table t1(c1 varchar2(10),c2 number(10,2),c3 date)"

DB21034E コマンドが、有効なコマンド行プロセッサー・コマ

ンドでないため、 SQL

ステートメントとして処理されました。 SQL

処理中に、そのコマンドが返されました。

SQL0104N "create table T1(C1 " に続いて予期しないトークン

"varchar2" が見つかりました。 予期されたトークンに "VARCHAR"

が含まれている可能性があります。 SQLSTATE=42601 db2inst1@db2V97onSLES10:~>

Page 7: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

7

4444....2222 互換機能互換機能互換機能互換機能がががが有効有効有効有効ななななデータベースデータベースデータベースデータベースでのでのでのでの使用使用使用使用

_表の作成

次に ORATEST2 データベースに接続して、同じ CREATE TABLE 文を実行してみます。

次のコマンドを実行します。

コマンド

db2 connect to oratest2

db2 "create table t1(c1 varchar2(10),c2 number(10,2),c3

date)"

実行例

データ・タイプの互換性のパラメーターが ON のため VARCHAR2 型や NUMBER 型の列を持つ

表の作成が成功します。

4444....3333 データデータデータデータのののの挿入挿入挿入挿入とととと参照参照参照参照

_表へのデータの挿入、参照

次にこの表に対して列属性の確認を行い、データの挿入、参照を行ってみます。

以下のコマンドを実行します。

コマンド

db2 describe table t1

db2 "insert into t1 values (100,10.2,sysdate)"

db2 "select * from t1"

db2inst1@db2V97onSLES10:~> db2 connect to oratest2

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST2

db2inst1@db2V97onSLES10:~> db2 "create table t1(c1 varchar2(10),c2 number(10,2),c3 date)"

DB20000I SQL コマンドが正常に完了しました。 db2inst1@db2V97onSLES10:~>

Page 8: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

8

実行例

DESCRIBE TABLE コマンドで列属性を確認すると VARCHAR2 で作成された列は VARCHAR、

NUMBER で作成された列は DECIMAL、DATE で作成された列は TIMESTAMP(0)として作成さ

れていることがわかります。

INSERT 文では、VARCHAR 列に数値を指定しても暗黙的に変換が行われ INSERT 文が成功

しています。また、SYSDATE 関数の使用も可能です。この暗黙的な型変換や SYSDATE 関数

は、DB2_COMPATIBILITY_VECTOR の設定とは関係なく使用できます。

db2inst1@db2V97onSLES10:~> db2 describe table t1

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

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

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

C1 SYSIBM VARCHAR 10 0 はい

C2 SYSIBM DECIMAL 10 2 はい

C3 SYSIBM TIMESTAMP 7 0 はい

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

db2inst1@db2V97onSLES10:~> db2 "insert into t1 values (100,10.2,sysdate)"

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

db2inst1@db2V97onSLES10:~> db2 "select * from t1"

C1 C2 C3

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

100 10.20 2009-08-06-22.55.07

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

Page 9: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

9

5555.... OracleOracleOracleOracle 互換互換互換互換ののののビルトインビルトインビルトインビルトイン関数関数関数関数のののの使用使用使用使用

_TO_CHAR 関数の使用

ここでは、Oracle 互換のビルトイン関数を使用してみます。

最初に TO_CHAR 関数を使用してみます。以下のコマンドを実行します。

コマンド

db2 connect to oratest2

db2 "select sysdate,to_char(sysdate,'HH:MI:SS') from dual"

実行例

TO_CHAR 関数によって出力フォーマットを指定しています。

_TO_NUMBER,TO_DATE 関数の使用

次に TO_NUMBER 関数と TO_DATE 関数を使用してみます。以下のコマンドを実行します。

コマンド

db2 "select to_number('123,456,789','999,999,999') from dual"

db2 "select to_date('2000/10/10','yyyy/mm/dd') from dual"

db2inst1@db2V97onSLES10:~> db2 connect to oratest2

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST2

db2inst1@db2V97onSLES10:~> db2 "select sysdate,to_char(sysdate,'HH:MI:SS') from dual"

1 2

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

2009-08-11-11.04.05 11:04:05

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

Page 10: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

10

実行例

TO_NUMBER 関数では、指定されたフォーマットを使用して文字列から数値データを取

り出しています。TO_DATE 関数では、指定されたフォーマットを使用して文字列から

TIMESTAMP データを取り出しています。

db2inst1@db2V97onSLES10:~> db2 "select to_number('123,456,789','999,999,999') from dual"

1

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

123456789

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

db2inst1@db2V97onSLES10:~> db2 "select to_date('2000/10/10','yyyy/mm/dd') from dual"

1

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

2000-10-10-00.00.00.000000

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

Page 11: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

11

6. PL/SQL のののの無名無名無名無名ブロックブロックブロックブロックのののの実行実行実行実行

_PL/SQL 無名ブロックの記述

PL/SQL の無名ブロックをファイルに作成し、実行します。

vi を起動して PL/SQL の無名ブロックを記述します。

(/workshop/lab3 ディレクトリに plsqltest.sql があります。お時間のない場合方や vi の操作に

慣れていない方はこちらのファイルをご使用ください。)

コマンド

vi plsqltest.sql

ファイルには以下の内容を記述します。

plsqltest.sql

_PL/SQL無名ブロックの実行

db2inst1 ユーザーで ORATEST2 データベースに接続して、以下のコマンドで plsqltest.sql ファ

イルに記述された PL/SQL の無名ブロックを実行します。

コマンド

db2 connect to oratest2

db2 -tvf plsqltest.sql

set sqlcompat plsql;

set serveroutput on;

declare

rec t1%rowtype;

begin

delete from t1;

for i in 1..3 loop

insert into t1 values (i,i,add_months(sysdate,i) )

returning c1,c2,c3 into rec;

dbms_output.put_line('inserted : '||rec.c1

||','||rec.c2||','||rec.c3);

end loop;

end;

/

set sqlcompat db2; set serveroutput off;

Page 12: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

12

実行例

この PL/SQL の無名ブロックでは、T1 表のデータを削除し、3 行のデータを挿入しています。

挿入後、挿入したデータを DBMS_OUTPUT.PUT_LINE プロシージャーで出力しています。

_データの確認

実際に T1 表にデータが格納されたことを以下のコマンドを実行して確認します。

コマンド

db2 “select * from t1”

実行例

3 行のデータが格納されていることを確認します。

db2inst1@db2V97onSLES10:~> db2 connect to oratest2

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST2

db2inst1@db2V97onSLES10:~> db2 -tvf plsqltest.sql

set sqlcompat plsql

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

set serveroutput on

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

declare

rec t1%rowtype;

begin

delete from t1;

for i in 1..3 loop

insert into t1 values (i,i,add_months(sysdate,i) )

returning c1,c2,c3 into rec;

dbms_output.put_line('inserted : '||rec.c1 ||','||rec.c2||','||rec.c3);

end loop;

end;

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

inserted : 1,1,2009-09-09-13.45.14

inserted : 2,2,2009-10-09-13.45.14

inserted : 3,3,2009-11-09-13.45.14

set sqlcompat db2

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

set serveroutput off

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

db2inst1@db2V97onSLES10:~> db2 "select * from t1"

C1 C2 C3

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

1 1.00 2009-09-06-23.11.13

2 2.00 2009-10-06-23.11.13

3 3.00 2009-11-06-23.11.13

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

Page 13: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

13

7777.... PL/SQLPL/SQLPL/SQLPL/SQL パッケージパッケージパッケージパッケージのののの作成作成作成作成とととと実行実行実行実行

7777....1111 PL/SQLPL/SQLPL/SQLPL/SQL パッケージパッケージパッケージパッケージのののの作成作成作成作成

_PL/SQL パッケージの作成

ここでは、PL/SQL のパッケージを作成して実行します。

最初に vi を起動して、CREATE PACKAGE 文を記述します。

(/workshop/lab3 ディレクトリに pkgtest.sql があります。お時間のない場合方や vi の操作に慣

れていない方はこちらのファイルをご使用ください。)

コマンド

vi pkgtest.sql

ファイルには以下の内容を記述します。

pkgtest.sql

db2inst1 ユーザーで ORATEST2 データベースに接続して、以下のコマンドで pkgtest.sql ファイ

ルに記述された CREATE PACKAGE 文を実行し、パッケージを作成します。

コマンド

db2 connect to oratest2

db2 -tvf pkgtest.sql

set sqlcompat plsql;

create or replace package pkg1

is

var varchar2(100) := 'default';

procedure print_var;

procedure set_var(ivar varchar2);

end;

/

create or replace package body pkg1

is

procedure print_var is

begin

dbms_output.put_line(var);

end;

procedure set_var(ivar varchar2(100))

is

begin

var := ivar;

end;

end;

/

Page 14: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

14

実行例

_パッケージ作成の確認

以下の SQL を実行してパッケージが作成されたことを確認します。

コマンド

db2 "select char(modulename,20) modulename,moduletype from

syscat.modules"

db2 "select * from syscat.moduleobjects where

objectmodulename = 'PKG1'"

db2inst1@db2V97onSLES10:~> db2 connect to oratest2

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST2

db2inst1@db2V97onSLES10:~> db2 -tvf pkgtest.sql

set sqlcompat plsql

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

create or replace package pkg1

is

var varchar2(100) := 'default';

procedure print_var;

procedure set_var(ivar varchar2);

end;

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

create or replace package body pkg1

is

procedure print_var is

begin

dbms_output.put_line(var);

end;

procedure set_var(ivar varchar2(100))

is

begin

var := ivar;

end;

end;

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

set sqlcompat db2

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

Page 15: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

15

実行例

SYSCAT.MODULES カタログビューに PKG1 パッケージがあることが確認できます。

SYSCAT.MODULEOBJECTS カタログビューには、PKG1 パッケージに属しているオブジェクト

が確認できます。

7777....2222 パッケージパッケージパッケージパッケージのののの実行実行実行実行

_パッケージの実行

次に PKG1 のプロシージャーを実行します。

以下のコマンドを実行します。

コマンド

db2 set serveroutput on

db2 call pkg1.print_var

db2 "call pkg1.set_var('ABC')"

db2 call pkg1.print_var

db2 set serveroutput off

db2inst1@db2V97onSLES10:~> db2 "select char(modulename,20) modulename,moduletype from

syscat.modules"

MODULENAME MODULETYPE

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

・・・省略・・

UTL_MAIL M

DBMS_STANDARD M

PKG1 P

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

db2inst1@db2V97onSLES10:~> db2 "select * from syscat.moduleobjects where objectmodulename =

'PKG1'"

OBJECTSCHEMA OBJECTMODULENAME OBJECTNAME

OBJECTTYPE PUBLISHED SPECIFICNAME

USERDEFINED

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

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

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

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

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

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

DB2INST1 PKG1 VAR

VARIABLE Y -

Y

DB2INST1 PKG1 SET_VAR

PROCEDURE Y SQL090809134922100

Y

DB2INST1 PKG1 PRINT_VAR

PROCEDURE Y SQL090809134922000

Y

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

Page 16: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

16

実行例

DBMS_OUTPUT.PUT_LINE プロシージャーによるバッファーへの書き出しを CLP で受け取るた

めに、set serveroutput on コマンドを実行します。

PKG1.PRINT_VAR プロシージャーにより、VAR 変数の内容を表示します。最初の呼び出しでは、

デフォルト値に設定した、’default’が確認できます。

次に、PKG1.SET_VAR プロシージャーで‘ABC’を VAR 変数にセットします。この後、

PKG1.PRINT_VAR プロシージャーで VAR 変数の内容を出力すると VAR 変数に’ABC’が入っ

ていることがわかります。

最後に、serveroutput の設定を元に戻すために、set serveroutput off コマンドを実行します。

db2inst1@db2V97onSLES10:~> db2 set serveroutput on

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

db2inst1@db2V97onSLES10:~> db2 call pkg1.print_var

リターン状況 = 0

default

db2inst1@db2V97onSLES10:~> db2 "call pkg1.set_var('ABC')"

リターン状況 = 0

db2inst1@db2V97onSLES10:~> db2 call pkg1.print_var

リターン状況 = 0

ABC

db2inst1@db2V97onSLES10:~> db2 set serveroutput off

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

db2inst1@db2V97onSLES10:~>

Page 17: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

17

8888.... 新新新新しいしいしいしいロックロックロックロック方式方式方式方式((((Currently CommittedCurrently CommittedCurrently CommittedCurrently Committed))))のののの確認確認確認確認

8888....1111 パラメーターパラメーターパラメーターパラメーターのののの無効化無効化無効化無効化

_パラメーターの確認

最初に Currently Committed の機能を有効にするパラメーターがどのような値に設定されてい

るか確認します。

コマンド

db2 get db cfg for oratest1 | grep CUR_COMMIT db2 get db cfg for oratest2 | grep CUR_COMMIT

実行例

CUR_COMMIT パラメーターは、V9.7 で新規に作成されたデータベースでのデフォルト値は ON

です。DB2_COMPATIBILITY_VECTOR の設定値には関連しません。

ここでは ORATEST1 の CUR_COMMIT の設定を OFF にして、ORATEST2 を CUR_COMMIT を

ON のままにしておきます。これらの2つのデータベースに同じ処理を実施し、このパラメーター

の動作の違いを確認します。

_パラメーターの無効化

最初に ORATEST1 の CUR_COMMIT の設定を OFF にします。

以下のコマンドを実行じます。

コマンド

db2 update db cfg for oratest1 using cur_commit off

db2 terminate

db2 force applications all

db2 connect to oratest1

db2 get db cfg for oratest1 show detail| grep CUR_COMMIT

db2inst1@db2V97onSLES10:~> db2 get db cfg for oratest1 | grep CUR_COMMIT

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

db2inst1@db2V97onSLES10:~> db2 get db cfg for oratest2 | grep CUR_COMMIT

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

db2inst1@db2V97onSLES10:~>

Page 18: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

18

実行例

設定後、データベースを DEACTIVATE するために、db2 terminate、db2 force applications コマ

ンドを実行します。

また、実際にパラメーターが変更されているか、db2 get db cfg コマンドを show detail オプショ

ンを付けて実行します。左側に出力される値が現行値です。DISABLED になっていることが確

認できるはずです。

8888....2222 テストテストテストテスト準備準備準備準備

Currently Committed のハンズオン準備のために、ORATEST1 データベース、ORATEST2 デ

ータベースに同じテーブルを用意します。

_ORATEST1 へのテーブル作成

最初に ORATEST1 データベースに、テーブルを作成します。

次のコマンドを実行します。

コマンド

db2 connect to oratest1

db2 "create table l1(c1 int,c2 int)"

db2 "insert into l1 values (1,1)"

db2inst1@db2V97onSLES10:~> db2 update db cfg for oratest1 using cur_commit off

DB20000I UPDATE DATABASE CONFIGURATION

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

db2inst1@db2V97onSLES10:~> db2 terminate

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

db2inst1@db2V97onSLES10:~> db2 force applications all

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

DB21024I このコマンドは非同期であり、即時に有効にならな

い場合もあります。

db2inst1@db2V97onSLES10:~> db2 connect to oratest1

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST1

db2inst1@db2V97onSLES10:~> db2 get db cfg for oratest1 show detail| grep CUR_COMMIT

CS 分離レベルで現在コミット済みの結果を戻す (CUR_COMMIT) = DISABLED DISABLED db2inst1@db2V97onSLES10:~>

Page 19: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

19

実行例

_ORATEST2へのテーブル作成

同様に、ORATEST2 データベースにもテーブルを作成します。

以下のコマンドを実行します。

コマンド

db2 connect to oratest2

db2 "create table l1(c1 int,c2 int)"

db2 "insert into l1 values (1,1)"

実行例

8888....3333 Currently CommitedCurrently CommitedCurrently CommitedCurrently Commited のののの動作動作動作動作のののの確認確認確認確認

_ORATEST1での CC動作確認

ここから Currently Committed の動作の違いを確認します。

2 つの Terminal を使用して動作の確認を行うため、最初に2つの Terminal を起動します。

Currently Committed の機能が有効になっていない ORATEST1 データベースでの動作の確認

を行います。

1つの Terminal(Terminal 1とします)で以下のコマンドを実行し、L1表の行にロッ

クを取得した状態にします。

db2inst1@db2V97onSLES10:~> db2 connect to oratest1

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST1

db2inst1@db2V97onSLES10:~> db2 "create table l1(c1 int,c2 int)"

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

db2inst1@db2V97onSLES10:~> db2 "insert into l1 values (1,1)"

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

db2inst1@db2V97onSLES10:~> db2 connect to oratest2

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST2

db2inst1@db2V97onSLES10:~> db2 "create table l1(c1 int,c2 int)"

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

db2inst1@db2V97onSLES10:~> db2 "insert into l1 values (1,1)"

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

db2inst1@db2V97onSLES10:~>

Page 20: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

20

コマンド db2 connect to oratest1

db2 +c "update l1 set c1 = 100, c2 = 100"

db2 +c "select * from l1"

db2pd -db oratest1 -locks

実行例(Terminal 1)

db2pd –db oratest1 –locksの結果に Typeが RowでMode Xの行があることがわかりま

す。これは、前に実行している Update文による更新中の行に Xロックが取られている

ことを表しています。

次に、2つめの Terminal(Terminal 2とします)で、このロックがとられた行を参照

してみます。以下のコマンドを実行します。

コマンド db2 connect to oratest1

db2 “select * from l1”

db2inst1@db2V97onSLES10:~> db2 connect to oratest1

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST1

db2inst1@db2V97onSLES10:~> db2 +c "update l1 set c1 = 100, c2 = 100"

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

db2inst1@db2V97onSLES10:~> db2 +c "select * from l1"

C1 C2

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

100 100

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

db2inst1@db2V97onSLES10:~> db2pd -db oratest1 -locks

Database Partition 4294967295 -- Database ORATEST1 -- Active -- Up 0 days 00:01:10

Locks:

Address TranHdl Lockname Type Mode Sts Owner Dur HoldCount Att ・・・

0x8E60C680 2 02000400040000000000000052 Row ..X G 2 1 0 ・・・・・・・・・・・・

0x8E60C580 2 53514C43324832307F4760B841 Internal P ..S G 2 1 0 ・・・

0x8E60C780 2 02000400000000000000000054 Table .IX G 2 1 0 ・・・

db2inst1@db2V97onSLES10:~>

Page 21: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

21

実行例(Terminal 2)

ここでは、L1表のデータが更新中であるため、SELECT文(読み取り)がロック待ち

します。

Terminal 1で以下のコマンドを発行してロック待ちの状況を確認します。

確認後、ロールバックしてロックの解除を行います。

コマンド db2pd -db oratest1 -locks

db2 rollback

実行例(Terminal 1)

db2pd -db oratest1 –locks の結果に、Type が Row、Mode が NS、Sts W となっている行がある

ことがわかります。これは、SELECT 文によるロック(NS ロック)がロック待機していることを表し

ています。

ロック待機が確認できたら、rollback しロックを開放します。その後、db2pd -db oratest1 –locks

を実行して、ロックが解除されているのを確認します。また、Terminal 2でロック待機していた処

理も終了しているはずです。

db2inst1@db2V97onSLES10:~> db2 connect to oratest1

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST1

db2inst1@db2V97onSLES10:~> db2 "select * from l1"

・・・ロック待ち・・・

db2inst1@db2V97onSLES10:~> db2pd -db oratest1 -locks

Database Partition 4294967295 -- Database ORATEST1 -- Active -- Up 0 days 00:06:47

Locks:

Address TranHdl Lockname Type Mode Sts Owner Dur HoldCount・・・

0x8E60C680 2 02000400040000000000000052 Row ..X G 2 1 0 ・・・

0x8E615B80 8 02000400040000000000000052 Row .NS W 0 1 0 ・・・・・・・・・・・・

0x8E60C580 2 53514C43324832307F4760B841 Internal P ..S G 2 1 0 ・・・

0x8E60DB80 8 53514C43324832307F4760B841 Internal P ..S G 8 1 0 ・・・

0x8E616700 8 01000000010000000100C05E56 Internal V ..S G 8 1 0 ・・・

0x8E60C780 2 02000400000000000000000054 Table .IX G 2 1 0 ・・・

0x8E60F800 8 02000400000000000000000054 Table .IS G 8 1 0 ・・・

db2inst1@db2V97onSLES10:~> db2 rollback

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

db2inst1@db2V97onSLES10:~> db2pd -db oratest1 -locks

Database Partition 4294967295 -- Database ORATEST1 -- Active -- Up 0 days 00:08:41

Locks:

Address TranHdl Lockname Type Mode Sts Owner Dur HoldCount Att

ReleaseFlg rrIID

db2inst1@db2V97onSLES10:~>

Page 22: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

22

_ORATEST2 での動作確認

次に Currently Committed の機能が有効になっている ORATEST2 データベースでの動作の確

認を行います。

Terminal 1で以下のコマンドを実行し、L1 表の行にロックを取った状態にします。

コマンド

db2 connect to oratest2

db2 +c "update l1 set c1 = 100, c2 = 100"

db2 +c "select * from l1"

db2pd -db oratest2 -locks

実行例(Terminal 1)

ORATEST1 データベースの時と同様に、更新中の行に Xロックが取得されていることがわかり

ます。

次に、Terminal 2で L1 表のデータを SELECT してみます。以下のコマンドを実行します。

コマンド

db2 connect to oratest2

db2 “select * from l1”

db2inst1@db2V97onSLES10:~> db2 connect to oratest2

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST2

db2inst1@db2V97onSLES10:~> db2 +c "update l1 set c1 = 100, c2 = 100"

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

db2inst1@db2V97onSLES10:~> db2 +c "select * from l1"

C1 C2

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

100 100

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

db2inst1@db2V97onSLES10:~> db2pd -db oratest2 -locks

Database Partition 4294967295 -- Database ORATEST2 -- Active -- Up 0 days 00:00:37

Locks:

Address TranHdl Lockname Type Mode Sts Owner Dur HoldCount・・

0x9A6CC580 2 53514C43324832307F4760B841 Internal P ..S G 2 1 0 ・・

0x9A6CC680 2 02000500040000000000000052 Row ..X G 2 1 0 ・・

0x9A6CC780 2 02000500000000000000000054 Table .IX G 2 1 0 ・・

db2inst1@db2V97onSLES10:~>

Page 23: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

23

実行例(Terminal 2)

ORATEST1の時とは違い、ロック待ちせず、更新前のデータが参照できます。

ORATEST2では、Currently Committed の機能が有効になっているため、更新中のデータを

ロック待ちせず、更新前データを返すような動作となっています。

Terminal 1で rollbackを行い、ロックの開放を行います。以下のコマンドを実行します。

コマンド db2 rollback

実行例(Terminal 1)

以上です。

db2inst1@db2V97onSLES10:~> db2 connect to oratest2

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0

SQL 許可 ID = DB2INST1

ローカル・データベース別名 = ORATEST2

db2inst1@db2V97onSLES10:~> db2 "select * from l1"

C1 C2

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

1 1

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

db2inst1@db2V97onSLES10:~>

db2inst1@db2V97onSLES10:~> db2 rollback

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

Page 24: [Lab 3] [Lab 3] OracleOracle からの からの移行をを …[Lab 3] [Lab 3] OracleOracle からの からの移行をををを促進促進 するすするるする新機能 新機能

24

© Copyright IBM Corporation 2009 All Rights Reserved.

本書に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、暗黙的にしろ、なんらの保証もなしに配布され

るものです。

この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用

する環境に統合する使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べら

れていますが、他のところで同じまたは同様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使

用先は、自己の責任において行う必要があります。