76
2Oracle互換(前半) に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、黙的にしろ、なんらの保証もなしに配布されるものです。 この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用する環境に統合す る使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べられていますが、他のところで同じまた は同様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使用先は、自己の責任において行う必要があります。 © Copyright IBM Japan Systems Engineering Co., Ltd. 2009 <第1.00版 2009年 7>

Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

第2章 Oracle互換(前半)本書に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、暗黙的にしろ、なんらの保証もなしに配布されるものです。

この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用する環境に統合する使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べられていますが、他のところで同じまた

は同様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使用先は、自己の責任において行う必要があります。

© Copyright IBM Japan Systems Engineering Co., Ltd. 2009

<第1.00版 2009年 7月>

Page 2: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

2 © 2009 ISE Corporation

• Oracle互換機能強化概要互換機能強化概要互換機能強化概要互換機能強化概要

• DB2_COMPATIBILITY_VECTOR

• データタイプデータタイプデータタイプデータタイプのののの互換性互換性互換性互換性

• スカラースカラースカラースカラー関数関数関数関数のののの機能強化機能強化機能強化機能強化

• ビルトインビルトインビルトインビルトイン・・・・パッケージパッケージパッケージパッケージ・・・・ライブラリーライブラリーライブラリーライブラリー

• PL/SQLサポートサポートサポートサポート

• パッケージパッケージパッケージパッケージ((((モジュールモジュールモジュールモジュール))))ののののサポートサポートサポートサポート

• 参考資料参考資料参考資料参考資料

内容

Page 3: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

3 © 2009 ISE Corporation

Oracle互換機能強化概要Oracle互換機能強化概要

Page 4: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

4 © 2009 ISE Corporation

Oracle互換機能の強化により移行が容易に

Oracle

Database

DB2

Database

Your Applications

Oracle SQL・・・・データデータデータデータ型型型型

PL/SQL

ビルトインビルトインビルトインビルトイン関数関数関数関数

ビルトインビルトインビルトインビルトイン・・・・パッケージパッケージパッケージパッケージ

Concurrency Control

SQL*Plus Scripts

ほとんどそのままほとんどそのままほとんどそのままほとんどそのまま

理解理解理解理解できるできるできるできる。。。。

ほとんどそのままほとんどそのままほとんどそのままほとんどそのまま動動動動くくくく

Oracle固有の機能や動作

Page 5: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

5 © 2009 ISE Corporation

Oracle互換機能概要

• データタイプ

• NUMBER、VARCHAR2、TIMESTAMP(n)、“DATE”

• BOOLEAN、INDEX BY、VARRAY、ROW TYPE、Ref Cursor

• ビルトイン関数

• 形式・型変換関連 (TO_CHAR, TO_DATE, TO_TIMESTAMP, TO_NUMBER, TO_CLOB)

• 日付操作関連(EXTRACT, ADD_MONTHS, …)

• 文字列操作関連(INITCAP, RPAD, LPAD, INSTR, REVERSE・・・)

• その他(DECODE, NVL, LEAST, GREATEST, BITAND)

• ビルトイン・パッケージ・ライブラリー

• DBMS_OUTPUT、UTL_FILE、DBMS_ALERT、DBMS_PIPE、DBMS_JOB、DBMS_LOB、DBMS_SQL、・・・

• フィーチャー

• CONNECT BY句を使用した階層照会

• 外部結合演算子 (+)-join

• DUAL表

• ROWNUM擬似列

• TRUNCATE TABLEステートメント

• Public synonym

• 作成済み一時表

• NEXTVAL/CURRVAL(シーケンスの呼び出し方法)

• MINUS(集合演算子 EXCEPTのAlias)

• Unnamed inline views

Page 6: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

6 © 2009 ISE Corporation

PL/SQLサポート概要

• PL/SQLの機能• All logic• EXCEPTION• User Defined Exceptions• Constant variables• FOR over range• over SELECT • over cursor• %TYPE• %ROWTYPE• BULK COLLECT/FETCH• FORALL• Autonomous transaction

• PL/SQLの記述場所• Anonymous block• Scalar function• Procedure• Package• Trigger

• パッケージオブジェクトのサポート• CREATE PACKAGE• CREATE PACKAGE BODY• Replace package body• PKG [BODY] VARIABLE• CURSOR• TYPE• EXCEPTION• SYNONYM ON PACKAGE

Page 7: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

7 © 2009 ISE Corporation

DB2_COMPATIBILITY_VECTORDB2_COMPATIBILITY_VECTOR

Page 8: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

8 © 2009 ISE Corporation

DB2_COMPATIBILITY_VECTOR レジストリ変数

• Oracleとの互換機能を有効にするレジストリ変数

• Oracle互換機能の中にはこのレジストリ変数の設定が必要なものがあります。

• 設定方法

• 12ビットのビットでそれぞれの機能をON、OFFを決定します。このビットの16進値を設定します。

• それぞれのビットに割り当てられている機能は次ページを参照• 全ての互換機能を有効にするにはFFF( =0x01+0x02+・・・+0x400+0x800)を指定

• DB2_COMPATIBILITY_VECTOR=ORAの設定も可能

• この設定はFFFと同じように全ての互換フィーチャーを有効にします。• この設定はOracle との最大の互換性を実現する設定であり、Oracle互換機能を

使用する際の推奨値となります。• またこの設定により、DB2_DEFERRED_PREPARE_SEMANTICS=YESの設

定も暗黙的に有効になります。• DB2_DEFERRED_PREPARE_SEMANTICS=YESは、Unicode,SBCS環境でのみの

推奨値となります。

Unicode,SBCS環境・DB2_COMPATIBILITY_VECTOR=ORA・DB2_DEFERRED_PREPARE_SEMANTICS=YES

それ以外の環境・DB2_COMPATIBILITY_VECTOR=ORA・DB2_DEFERRED_PREPARE_SEMANTICS=NO

以上により、こちらがそれぞれの環境での推奨値

暗黙的に設定されますが明示指定されることをお勧めします

Page 9: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

9 © 2009 ISE Corporation

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

PL/SQL ステートメントおよび言語要素のコンパイルと実行を可能にします。PL/SQL のコンパイル12 (0x800)

データ・ディクショナリー互換ビューの作成を可能にします。データ・ディクショナリー互換ビュー11 (0x400)

配列で first、last、next、previous などの演算を実行するメソッドの使用を可能にします。また、配列内の特定の要素の参照に、大括弧の代わりに括弧を使用できるようにします。例えば、array1(i) は array1 の要素 i を参照します。

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

バイト長が 254 以下である文字定数および GRAPHIC ストリング定数に、CHAR データ・タイプまたは GRAPHIC データ・タイプ (VARCHAR データ・タイプでもVARGRAPHIC データ・タイプでもない) を割り当てることを可能にします。

文字リテラル9 (0x100)

TRUNCATE ステートメント用の代替セマンティクスを有効にします。IMMEDIATE がオプションのキーワードであり、指定がない場合にデフォルトになります。TRUNCATE ステートメントが論理作業単位内の最初のステートメントではない場合、TRUNCATE ステートメントが実行される前に暗黙的なコミット操作が実行されます。

TRUNCATE TABLE8 (0x80)

DATE データ・タイプを日付と時間の値を結合した TIMESTAMP(0) として使用することを可能にします。

DATE データ・タイプ7 (0x40)

VARCHAR2 データ・タイプおよび関連する文字ストリング処理を有効にします。VARCHAR2 データ・タイプ6 (0x20)

NUMBER データ・タイプおよび関連する数値処理を有効にします。NUMBER データ・タイプ5 (0x10)

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

外部結合演算子 (+) のサポートを有効にします。外部結合演算子3 (0x04)未使用未使用2 (0x02)

ROWNUM を ROW_NUMBER() OVER() の同義語として使用することを可能にし、ROWNUM を SQL ステートメントの WHERE 節に含めることを許可します。

ROWNUM1 (0x01)

説明互換性フィーチャービット位置

Page 10: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

10 © 2009 ISE Corporation

DB2_COMPATIBILITY_VECTORの設定

• DB2_COMPATIBILITY_VECTOR、DB2_DEFERRED_PREPARE_SEMANTICSを設定後、インスタンスの再起動をして設定を有効にします。

• 以下の機能は、データベース作成時にDB2_COMPATIBILITY_VECTORを設定しておかなければ、機能を有効に出来ません。

• VARCHAR,NUMBER,DATEのデータタイプの互換性

• データディクショナリー互換ビュー

C:¥work>db2set DB2_COMPATIBILITY_VECTOR=ORA

C:¥work>db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES

C:¥work>db2stop force2009-06-30 09:29:08 0 0 SQL1064N DB2STOP の処理が正常に終了しました。SQL1064N DB2STOP の処理が正常に終了しました。

C:¥work>db2start2009-06-30 09:29:13 0 0 SQL1063N DB2START の処理が正常に終了しました。SQL1063N DB2START の処理が正常に終了しました。

C:¥work>db2setDB2_DEFERRED_PREPARE_SEMANTICS=YESDB2_COMPATIBILITY_VECTOR=ORADB2INSTOWNER=・・・・・・

DB2_COMPATIBILITY_VECTOR設定例

Page 11: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

11 © 2009 ISE Corporation

データタイプの互換性データタイプの互換性

Page 12: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

12 © 2009 ISE Corporation

データタイプの互換性

• NUMBER,VARCHAR2,DATEのののの互換性互換性互換性互換性

• Oracleからの移行時のデータタイプのマッピングやDDLの変更を最小限できる

• Oracleがサポートしている以下のデータタイプとの互換性をサポート• DATE• NUMBER• VARCHAR2

• データタイプデータタイプデータタイプデータタイプのののの互換性互換性互換性互換性をををを有効有効有効有効にするにはにするにはにするにはにするには、、、、DB2_COMPATIBILITY_VECTORのののの設定設定設定設定がががが必要必要必要必要

• データベース作成時に設定が行われている必要がある、データベース作成後は変更不可

• 以下のデータベース構成パラメーターの以下の項目で互換性サポートを有効化を確認できる

• NUMBER データ・タイプの互換性• VARCHAR2 データ・タイプの互換性• データ・タイプ DATE の TIMESTAMP(0) への互換性

C:¥>db2 get db cfg for sample | find "互換性"

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

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

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

確認例

Page 13: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

13 © 2009 ISE Corporation

DATEデータタイプの互換性

• 「「「「データデータデータデータ・・・・タイプタイプタイプタイプ DATE のののの TIMESTAMP(0) へのへのへのへの互換性互換性互換性互換性」」」」ががががON

• DATEタイプがTIMESTAMP(0)として扱われる

• OracleのDATEとの互換

• OracleのDATEは、秒までの精度を持つ

create table tab1(c1 date)DB20000I SQL コマンドが正常に完了しました。

describe table tab1

データ・タイ データ・ 列の スケ列名 プ・スキーマ タイプ名 長さ ール NULL------------- --------- ------------------- ---------- ----- ------C1 SYSIBM DATE 4 0 はい

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

insert into tab1 values current dateDB20000I SQL コマンドが正常に完了しました。

select * from tab1

C1----------2009-04-22

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

create table tab1(c1 date)DB20000I SQL コマンドが正常に完了しました。

describe table tab1

データ・タイ データ・ 列の スケ列名 プ・スキーマ タイプ名 長さ ール NULL--------- --------- ------------------- ---------- ----- ------C1 SYSIBM TIMESTAMP 7 0 はい

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

insert into tab1 values current dateDB20000I SQL コマンドが正常に完了しました。

select * from tab1

C1-------------------2009-04-22-13.39.31

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

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

Date型でテーブルを作成するとTimestamp(0)として定義される

出力形式(精度)が異なる

Page 14: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

14 © 2009 ISE Corporation

参考)TIMESTAMPの精度指定

• TIMESTAMPのののの精度精度精度精度のののの指定指定指定指定がががが可能可能可能可能

• 互換機能(DB2_COMPATIBILITY_VECTOR)に関係なくV9.7から使用可能

• 小数点以下の秒数の精度を指定

• 0から12までを指定可能(デフォルト:6)

• OracleのTimestamp型との互換 ← OracleのTimestampでも精度指定可能(指定可能な桁数 0-9)

• より高い精度を持つTIMESTAMP型の使用

• 低い精度を指定することでスペースの節約

create table tab1( c0 timestamp(0),c1 timestamp(1),c2 timestamp(2), c3 timestamp(3),c4 timestamp(4),c5 timestamp(5), c6 timestamp(6),c7 timestamp(7),c8 timestamp(8), c9 timestamp(9),c10 timestamp(10),c11 timestamp(11), c12 timestamp(12),c13 timestamp )DB20000I SQL コマンドが正常に完了しました。

describe table tab1

データ・タイ データ・ 列の スケ列名 プ・スキーマ タイプ名 長さ ール NULL-------------- --------- ------------------- ---------- ----- ------C0 SYSIBM TIMESTAMP 7 0 はいC1 SYSIBM TIMESTAMP 8 1 はいC2 SYSIBM TIMESTAMP 8 2 はいC3 SYSIBM TIMESTAMP 9 3 はいC4 SYSIBM TIMESTAMP 9 4 はいC5 SYSIBM TIMESTAMP 10 5 はいC6 SYSIBM TIMESTAMP 10 6 はいC7 SYSIBM TIMESTAMP 11 7 はいC8 SYSIBM TIMESTAMP 11 8 はいC9 SYSIBM TIMESTAMP 12 9 はいC10 SYSIBM TIMESTAMP 12 10 はいC11 SYSIBM TIMESTAMP 13 11 はいC12 SYSIBM TIMESTAMP 13 12 はいC13 SYSIBM TIMESTAMP 10 6 はい

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

values current timestamp

1--------------------------2009-04-22-18.53.07.156000

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

values current timestamp(0)

1-------------------2009-04-22-18.53.07

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

values current timestamp(12)

1--------------------------------2009-04-22-18.53.07.171000000000

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

精度の指定により列の長さが変わる

精度を短くとることでスペースの節約が可能

CURRENT TIMESTAMP特殊

レジスターも精度指定可能

Page 15: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

15 © 2009 ISE Corporation

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

• 「「「「NUMBERデータデータデータデータ・・・・タイプタイプタイプタイプのののの互換性互換性互換性互換性」」」」ががががON

• 表定義時の列タイプやプロシージャー内の変数タイプなどでNUMBER型を使用することが出来る

• 実際には以下のような型として作成される• NUMBER -> DECFLOAT(16)• NUMBER(p)->DECIMAL(p)• NUMBER(p,s)->DECIMAL(p,s)

• 精度(p)は31まで

create table tab1(c1 numbernumbernumbernumber,c2 numbernumbernumbernumber(10),c3 numbernumbernumbernumber(10,5))DB20000I SQL コマンドが正常に完了しました。

describe table tab1データ・タイ データ・ 列の スケ

列名 プ・スキーマ タイプ名 長さ ール NULL----------------- --------- ------------------- ---------- ----- ------C1 SYSIBM DECFLOAT 8 0 はいC2 SYSIBM DECIMAL 10 0 はいC3 SYSIBM DECIMAL 10 5 はい

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

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

精度を付けないNUMBER型でテーブルを作成するとDECFLOAT(16)型として定義されます。

精度、位取りを付けたNUMBER型はDECIMALとして定義されます。

DDLでNUMBERを使用することが出来ます。

Page 16: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

16 © 2009 ISE Corporation

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

• 「「「「VARCHAR2データデータデータデータ・・・・タイプタイプタイプタイプのののの互換性互換性互換性互換性」」」」ががががON

• 表定義時の列タイプやプロシージャー内の変数タイプなどでVARCHAR2型を使用することが出来る

• 実際には、VARCHARとして作成される

• 空文字('')がNULLとして扱われる

• VARCHARの比較には非空白埋め比較セマンティクスが使用される

• 長さが最大 254 バイトまでの文字ストリング・リテラルのデータ・タイプは CHARになり、254以上はVARCHARになる

create table tab1(c1 varchar2varchar2varchar2varchar2(10),c2 varchar2varchar2varchar2varchar2(10) for bit data)DB20000I SQL コマンドが正常に完了しました。

describe table tab1

データ・タイ データ・ 列の スケ列名 プ・スキーマ タイプ名 長さ ール NULL--------------- --------- ------------------- ---------- ----- ------C1 SYSIBM VARCHAR 10 0 はいC2 SYSIBM VARCHAR 10 0 はい

2 レコードが選択されました。Varchar2型でテーブルを作成す

るとVarcharとして定義される

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

DDLでVARCHAR2が使用できる

Page 17: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

17 © 2009 ISE Corporation

VARCHAR2 データ・タイプの互換性 ON/OFFの違い

• 空文字空文字空文字空文字((((''))))のののの扱扱扱扱いいいいとVARCHARのののの末尾末尾末尾末尾ブランクブランクブランクブランクのののの比較比較比較比較の違いについて確認

C:¥work¥asnclp>db2 -tvf varchar2test.sqlcreate table tab1(c1 varchar(10))DB20000I SQL コマンドが正常に完了しました。

insert into tab1 values (null),(''),('a'),('a ')DB20000I SQL コマンドが正常に完了しました。

select c1,hex(c1) from tab1

C1 2---------- --------------------- -

a 61a 6120

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

select c1,hex(c1) from tab1 where c1 = 'a'

C1 2---------- --------------------a 61a 6120

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

C:¥work¥asnclp>db2 -tvf varchar2test.sqlcreate table tab1(c1 varchar(10))DB20000I SQL コマンドが正常に完了しました。

insert into tab1 values (null),(''),('a'),('a ')DB20000I SQL コマンドが正常に完了しました。

select c1,hex(c1) from tab1

C1 2---------- --------------------- -- -a 61a 6120

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

select c1,hex(c1) from tab1 where c1 = 'a'

C1 2---------- --------------------a 61

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

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

空文字(’’)OFF:0バイトの文字ON:NULL

VARHCHARの比較OFF:末尾ブランクは無視されるON:末尾ブランクも含めて比較

Page 18: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

18 © 2009 ISE Corporation

参考)非空白埋め比較セマンティクスと空白埋め比較セマンティクス

• 非空白埋非空白埋非空白埋非空白埋めめめめ比較比較比較比較セマンティクスセマンティクスセマンティクスセマンティクス

• 以下の文字は異なるものとみなす

• 'A'、'A_'、'A__' ('_'は空白文字)

• 空白埋空白埋空白埋空白埋めめめめ比較比較比較比較セマンティクスセマンティクスセマンティクスセマンティクス

• 空白文字をパティングして比較する

• 末尾の空白文字の違いは無視される

• 以下の文字は同じものとみなす

• 'A'、'A_'、'A__' ('_'は空白文字)

OracleのVARCHARの比較

はこちらが使用される

VARCHAR2 データ・タイプの互換性=OFFの時のDB2のVARCHARの比較はこちらが

使用される

VARCHAR2 データ・タイプの互換性=ONの時のDB2のVARCHARの比較はこちらが

使用される

Page 19: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

19 © 2009 ISE Corporation

スカラー関数の機能強化スカラー関数の機能強化

Page 20: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

20 © 2009 ISE Corporation

スカラー関数の機能強化

• Oracleののののスカラースカラースカラースカラー関数関数関数関数とととと同同同同じじじじ名前名前名前名前でででで同同同同じじじじ動作動作動作動作をするをするをするをする関数関数関数関数のののの追加追加追加追加

• Oracleからの移行の際に、これらの関数によりSQLの書き換えが必要なくなる(Oracleの全関数をサポートしていないため注意)

• 以下以下以下以下のようなのようなのようなのような関数関数関数関数をををを新規新規新規新規ででででサポートサポートサポートサポートまたはまたはまたはまたは機能拡張機能拡張機能拡張機能拡張

• 形式・型変換関連• TO_CHAR, TO_DATE, TO_TIMESTAMP, TO_NUMBER, TO_CLOB

• 日付操作関連• EXTRACT, ADD_MONTHS, …

• 文字列操作関連• INITCAP, RPAD, LPAD, INSTR, REVERSE・・・

• その他• DECODE, NVL, LEAST, GREATEST, BITAND

Page 21: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

21 © 2009 ISE Corporation

形式・型変換関連のスカラー関数の使用例

• 関数関数関数関数

• フォーマットストリングを使用し、フォーマットの変換を行いながら型変換を行える

• TO_NUMBER(数値型への変換)• TO_CHAR(文字型への変換)• TO_DATE(日付型への変換)• TO_TIMESTAMP(タイムスタンプへの変換)

• キャストとの違い

• フォーマットの変換を行いながら型変換を行う• 例

• '$123,456,789' (文字)→ 123456789(数値)• 123456789 (数値)→ '$123,456,789' (文字)• '09/05/20' (文字)→ 2009-05-20-00.00.00(タイムスタンプ)• 2009-05-20-00.37.24.843000(タイムスタンプ) → '09/05/20' (文字)

C:¥>db2 values to_number('$123,456,789','$999,999,999')

1------------------------------------------

123456789

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

C:¥>db2 values to_char(123456789,'$999,999,999')

1-------------------------------------------------$ 123,456,789

1 レコードが選択されました。数値型に変換

TO_NUMBER使用例 TO_CHAR使用例

文字型に変換

Page 22: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

22 © 2009 ISE Corporation

ビルトイン・パッケージ・ライブラリー

(ビルトイン・モジュール)

ビルトイン・パッケージ・ライブラリー

(ビルトイン・モジュール)

Page 23: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

23 © 2009 ISE Corporation

ビルトイン・パッケージ・ライブラリー(ビルトイン・モジュール)

• V9.7ではではではではアプリケーションアプリケーションアプリケーションアプリケーション開発開発開発開発にににに役立役立役立役立つつつつビルトインビルトインビルトインビルトイン・・・・パッケージパッケージパッケージパッケージ・・・・ライブラライブラライブラライブラリーリーリーリーをををを多数提供多数提供多数提供多数提供

• パッケージ(モジュール)は、関数やプロシージャーや変数などをまとめたオブジェクトでSQLから呼び出すことが可能です。(PL/SQLやSQL PLからも呼び出すことも可能)

• SQLのみでは出来ないような処理(例:ファイル操作、メッセージの出力など)を行うことができます。

• Oracleとととと同同同同じじじじ名前名前名前名前でででで同同同同じじじじ機能機能機能機能をををを持持持持つつつつビルトインビルトインビルトインビルトイン・・・・パッケージパッケージパッケージパッケージ・・・・ライブラリーライブラリーライブラリーライブラリーをををを提供提供提供提供

• OracleのPL/SQLの開発では、ビルトイン・パッケージ・ライブラリーが頻繁に利用されます。

• OracleのPL/SQLの移行の際に、使用されているビルトイン・パッケージ・ライブラリーがDB2 V9.7でも提供されていれば書き直しなしでの移行も可能です。

Page 24: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

24 © 2009 ISE Corporation

ビルトイン・パッケージ・ライブラリー(ビルトイン・モジュール)

説明説明説明説明モジュールモジュールモジュールモジュール名名名名

UTL_SMTP モジュールは、SMTP (Simple Mail Transfer Protocol) を介して E メールを送信する機能を提供します。

UTL_SMTP

UTL_MAIL モジュールは、E メールを送信する機能を提供します。UTL_MAIL

UTL_FILE モジュールは、データベース・サーバーのファイル・システム上のファイルとの間で読み取りおよび書き込みを行うための一連のルーチンを提供します。

UTL_FILE

UTL_DIR モジュールは、UTL_FILE モジュールで使用するディレクトリー別名を維持するための一連のルーチンを提供します。

UTL_DIR

DBMS_UTILITY モジュールは、さまざまなユーティリティー・プログラムを提供します。DBMS_UTILITY

DBMS_SQL モジュールは、動的 SQL を実行するための一連のプロシージャーを提供します。したがって、さまざまなデータ操作言語 (DML) ステートメントやデータ定義言語 (DDL) ステートメントをサポートします。

DBMS_SQL

DBMS_PIPE モジュールは、同じデータベースに接続されたセッション内またはセッション間のパイプを通して、メッセージを送信するための一連のルーチンを提供します。

DBMS_PIPE

DBMS_OUTPUT モジュールは、メッセージ・バッファーにメッセージを書き込み (複数行のテキスト)、メッセージ・バッファーからメッセージを取得する一連のプロシージャーを提供します。これらのプロシージャーは、メッセージを標準出力に書き込む必要のあるアプリケーション・デバッグの際に役立ちます。

DBMS_OUTPUT

DBMS_LOB モジュールは、ラージ・オブジェクトを操作する機能を提供します。DBMS_LOB

DBMS_JOB モジュールは、ジョブの作成、スケジューリング、および管理のためのプロシージャーを提供します。DBMS_JOB

DBMS_ALERT モジュールは、アラートの登録、アラートの送受信を行うための一連のプロシージャーを備えています。

DBMS_ALERT

Page 25: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

25 © 2009 ISE Corporation

DBMS_OUTPUT使用例

• DBMS_OUTPUTパッケージパッケージパッケージパッケージ((((モジュールモジュールモジュールモジュール))))

• メッセージバッファーへの書き込み、読み込み行うためのプロシジャー、関数を提供

• 処理結果の出力、デバッグなどで役立ちます。

C:¥work>db2 -td@ -vf dbms_output_test.sqldrop procedure proc1DB20000I SQL コマンドが正常に完了しました。

CREATE PROCEDURE proc1( P1 VARCHAR(10) )BEGINCALL DBMS_OUTPUT.PUTDBMS_OUTPUT.PUTDBMS_OUTPUT.PUTDBMS_OUTPUT.PUT( 'P1 = ' );CALL DBMS_OUTPUT.PUT_LINEDBMS_OUTPUT.PUT_LINEDBMS_OUTPUT.PUT_LINEDBMS_OUTPUT.PUT_LINE( P1 );

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

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

CALL proc1( '10' )

リターン状況 = 0

P1 = 10

CLPでメッセージバッファーを

読み出すための設定

メッセージ・バッファーから読み出されたデータ

DBMS_OUTPUTパッケージのPUTプロシージャー、PUT_LINEプロシージャーを

呼び出して、メッセージ・バッファーへの書き込みを行います。

Page 26: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

26 © 2009 ISE Corporation

UTL_DIR、UTL_FILE使用例

call utl_dir.create_directoryutl_dir.create_directoryutl_dir.create_directoryutl_dir.create_directory('mydir','C:¥work')

リターン状況 = 0

call utl_dir.get_directory_pathutl_dir.get_directory_pathutl_dir.get_directory_pathutl_dir.get_directory_path('mydir',?)

出力パラメーターの値--------------------------パラメーター名: PATHパラメーター値: C:¥work

リターン状況 = 0

• UTL_DIRパッケージパッケージパッケージパッケージ

• ディレクトリを管理するためのプロシージャーや関数を提供

• UTL_FILEパッケージパッケージパッケージパッケージ

• ファイルの読み取りや書き込みを行うプロシージャーや関数を提供

begindeclare v_filehandle utl_file.file_typeutl_file.file_typeutl_file.file_typeutl_file.file_type;declare isopen boolean;declare row varchar(4000);set v_filehandle = utl_file.fopenutl_file.fopenutl_file.fopenutl_file.fopen('mydir','myfile.csv','w');set isopen = utl_file.is_openutl_file.is_openutl_file.is_openutl_file.is_open( v_filehandle );if isopen != true then

return ;end if;

for cur as (select deptno,deptname,mgrno from department)doset row = cur.deptno||','||cur.deptname||','||cur.mgrno;call utl_file.put_lineutl_file.put_lineutl_file.put_lineutl_file.put_line(v_filehandle,row);

end for;call utl_file.fcloseutl_file.fcloseutl_file.fcloseutl_file.fclose(v_filehandle);

end

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

!type myfile.csvA00,SPIFFY COMPUTER SERVICE DIV.,000010B01,PLANNING,000020C01,INFORMATION CENTER,000030D11,MANUFACTURING SYSTEMS,000060・・・省略・・・

UTL_DIRを使用してディレクトリの準備

UTL_FILEを使用してファイルに出力

CSV形式で

ファイル出力

Page 27: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

27 © 2009 ISE Corporation

PL/SQLサポートPL/SQLサポート

Page 28: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

28 © 2009 ISE Corporation

PL/SQLとは

• SQLの手続き型拡張機能としてOracle社が提供するプログラミング言語

• Oracle向けに独自に開発されているため、SQLのように標準仕様にのっとったものではない。

• Oracle Database の内部でSQLとの緊密な連携を行うことで業務処理を効率的に実行する。

• 反復処理や分岐といった制御構造を使って複雑な処理を行うことができる。

• なぜPL/SQLが必要?• SQLはデータの集合を操作するための言語であるが、実際の業務処理(ビジネス・ロジック)では手続き型の処理が必要な場

合もある。

OracleでのPL/SQL実行例

制御文とSQLで

構成される

Page 29: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

29 © 2009 ISE Corporation

PL/SQLが記述される場所

• PL/SQLブロック(Anonymous Block)

• データベース外部に保持

• PL/SQLストアード・プログラム

(データベースのオブジェクトとしてデータベース内にロジックを格納)

• プロシージャー

• ファンクション

• パッケージ

• トリガー

declare

・・・begin

・・・end

create procedure xxis

・・・begin

・・・end

create function xxxreturn varchar2is・・・

begin・・・

end;

create trigger xxxbefore insert ・・・on ・・・for each row declare

・・・begin

・・・end;

プロシージャー

ファンクション

トリガー

PL/SQLブロック

実行

Page 30: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

30 © 2009 ISE Corporation

DB2 9.7でのPL/SQLサポート

• DB2 9.7では新たにPL/SQLをサポート

• V9.5まではSQL PLのみ

DB2 Server

PL/SQL

Compiler

SQL PLCompiler

SURE(SQL Unified Runtime Engine)

Data base

Editor

DB2 9.7では

PL/SQL用とSQL PL用の2つの

コンパイラを持つ

それぞれのコンパイラから作成

されたモジュールは同じランタイム

で稼動する

New

Page 31: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

31 © 2009 ISE Corporation

DB2 9.7でPL/SQLを実行カーソルを使って、DEPT

表から結果を読み取る。

前のページと全く同一PL/SQLスクリプトを実施

PL/SQLユニークな文法がDB2で利用できる。

Page 32: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

32 © 2009 ISE Corporation

DB2とOracleのPL/SQL実行比較

• CLPPlusととととSQL*Plusでででで同同同同じじじじPL/SQLブロックブロックブロックブロックをををを実行実行実行実行

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsに接続されました。SQL> set serveroutput onSQL> DECLARE2 str VARCHAR2(30);3 BEGIN4 str := 'HELLO WORLD';5 DBMS_OUTPUT.PUT_LINE(str);6 END;7 /

HELLO WORLD

PL/SQLプロシージャが正常に完了しました。

SQL>

CLPPlus: バージョン 1.0Copyright (c) 2009, IBM CORPORATION. All rights reserved.

SQL> set serveroutput onSQL> DECLARE2 str VARCHAR2(30);3 BEGIN4 str := 'HELLO WORLD';5 DBMS_OUTPUT.PUT_LINE(str);6 END;7 /

HELLO WORLD

DB250000I: コマンドは正常に完了しました。

SQL>

CLPPlusからDB2に対して実行SQL*PlusからOracleに対して実行

Page 33: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

33 © 2009 ISE Corporation

PL/SQLを実行するには?

• DB2_COMPATIBILITY_VECTOR (レジストリ変数)

• PL/SQLコンパイラを使用可能にするかを指定

• PL/SQLを実行するためには設定は必須

• SET SQLCOMPAT PLSQL(CLPオプション)

• CLPにPL/SQLの区切り文字(/)を認識させるオプション

Page 34: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

34 © 2009 ISE Corporation

DB2_COMPATIBILITY_VECTOR=800の設定

• DB2_COMPATIBILITY_VECTOR=800をををを設定設定設定設定することですることですることですることでPL/SQLをををを処理処理処理処理できるようになるできるようになるできるようになるできるようになる

C:¥work>db2 -tvf plsqltest2.sql!db2set |findstr DB2_COMPATIBILITY_VECTOR

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

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

declarev1 varchar(100) := 'PL/SQL Test';

begindbms_output.put_line(v1);

end;

DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQLステートメントとして処理されました。 SQL 処理中に、そのコマンドが返されました。SQL0104N "BEGIN-OF-STATEMENT" に続いて予期しないトークン"declare v1 varchar"が見つかりました。予期されたトークンに "<values>"が含まれている可能性があります。 LINE NUMBER=2. SQLSTATE=42601

C:¥work>db2 -tvf plsqltest2.sql!db2set |findstr DB2_COMPATIBILITY_VECTORDB2_COMPATIBILITY_VECTOR=800DB2_COMPATIBILITY_VECTOR=800DB2_COMPATIBILITY_VECTOR=800DB2_COMPATIBILITY_VECTOR=800

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

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

declarev1 varchar(100) := 'PL/SQL Test';

begindbms_output.put_line(v1);

end;

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

PL/SQL Test

DB2_COMPATIBILITY_VECTOR=800をををを設定設定設定設定

DB2_COMPATIBILITY_VECTOR=800設定設定設定設定ありありありあり

DB2_COMPATIBILITY_VECTOR=800設定設定設定設定なしなしなしなし

C:¥>db2set DB2_COMPATIBILITY_VECTOR=800

C:¥>db2stop force2009-05-12 12:37:25 0 0 SQL1064N DB2STOP の処理が正常に終了しました。SQL1064N DB2STOP の処理が正常に終了しました。

C:¥>db2start2009-05-12 12:37:31 0 0 SQL1063N DB2START の処理が正常に終了しました。SQL1063N DB2START の処理が正常に終了しました。

PL/SQLブロックブロックブロックブロックがががが正常正常正常正常にににに処理処理処理処理されるされるされるされる

PL/SQLブロックブロックブロックブロックのののの処理処理処理処理にににに失敗失敗失敗失敗

Page 35: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

35 © 2009 ISE Corporation

SET SQLCOMPAT PLSQL((((CLPオプションオプションオプションオプション))))

• CLPからPL/SQLを実行するためのオプション

• SET SQLCOMPAT PLSQLを設定することで“/”をPL/SQLブロックの終わりと認識する

• PL/SQLでは、“;”はステートメントの区切り。ブロック単位で実行させるために、ブロックの最後を”/”で認識

• セッションの終わりまで有効

• SET SQLCONMPAT DB2 で元に戻す

Page 36: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

36 © 2009 ISE Corporation

PL/SQLサポート制約事項

• 以下以下以下以下のののの製品製品製品製品エディションエディションエディションエディションではではではでは、、、、PL/SQL ステートメントステートメントステートメントステートメントののののコンパイルコンパイルコンパイルコンパイルおよびおよびおよびおよび実行実行実行実行ははははサポートサポートサポートサポートされされされされませんませんませんません。。。。

• DB2 Express

• DB2 Express-C

• DB2 Personal Edition

• パーティションパーティションパーティションパーティション・・・・データベースデータベースデータベースデータベース環境環境環境環境ではではではでは、、、、PL/SQL 関数関数関数関数およびおよびおよびおよびトリガートリガートリガートリガーはははは作成作成作成作成できませんできませんできませんできません。。。。

• データベースデータベースデータベースデータベースがががが Unicode データベースデータベースデータベースデータベースとしてとしてとしてとして定義定義定義定義されていないされていないされていないされていない場合場合場合場合、、、、PL/SQL ステートメントステートメントステートメントステートメントおよびおよびおよびおよび PL/SQL コンテキストコンテキストコンテキストコンテキストにおいてにおいてにおいてにおいて、、、、NCLOB データデータデータデータ・・・・タイプタイプタイプタイプのののの使用使用使用使用ははははサポートサポートサポートサポートされませんされませんされませんされません。。。。Unicode データベースデータベースデータベースデータベースではではではでは、、、、NCLOB データデータデータデータ・・・・タイプタイプタイプタイプはははは、、、、DB2 DBCLOB データデータデータデータ・・・・タイプタイプタイプタイプににににマッマッマッマッププププされますされますされますされます。。。。

• XMLTYPE データデータデータデータ・・・・タイプタイプタイプタイプははははサポートサポートサポートサポートされませんされませんされませんされません。。。。

• TYPE 宣言宣言宣言宣言はははは、、、、関数関数関数関数、、、、プロシージャープロシージャープロシージャープロシージャー、、、、トリガートリガートリガートリガー、、、、およびおよびおよびおよび無名無名無名無名ブロックブロックブロックブロックではではではではサポートサポートサポートサポートされませんされませんされませんされません。。。。

• FOR EACH STATEMENT オプションオプションオプションオプションはははは、、、、PL/SQL トリガートリガートリガートリガーではではではではサポートサポートサポートサポートされませんされませんされませんされません。。。。

Page 37: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

37 © 2009 ISE Corporation

パッケージ(モジュール)のサポートパッケージ(モジュール)のサポート

Page 38: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

38 © 2009 ISE Corporation

パッケージ(モジュール)のサポート

• モジュール

• Oracleののののパッケージパッケージパッケージパッケージにににに相当相当相当相当するするするするオブジェクトオブジェクトオブジェクトオブジェクト

• 関数関数関数関数、、、、プロシージャープロシージャープロシージャープロシージャー、、、、タイプタイプタイプタイプ、、、、変数変数変数変数などのなどのなどのなどのオブジェクトオブジェクトオブジェクトオブジェクトをまとめたをまとめたをまとめたをまとめたオブジェクオブジェクオブジェクオブジェクトトトト

• 以下のオブジェクトを含められる• SQLプロシージャー

• SQLファンクション

• 外部プロシージャー

• 外部ファンクション

• グローバルコンディション

• Moduleの初期化処理

• ユーザー定義タイプ(配列、連想配列、行タイプ、カーソルタイプ)

• グローバル変数

• PL/SQLののののパッケージパッケージパッケージパッケージとととと同同同同じじじじ機能機能機能機能をををを提供提供提供提供

• PL/SQLではCREATE PACKAGE文によりモジュールを作成

• SQL PLではCREATE MODULE文によりモジュールを作成

Module

SQLプロシージャー

グローバル変数

SQLファンクション

・・・・・・・・・・・・

Page 39: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

39 © 2009 ISE Corporation

モジュールの構成

• Moduleは仕様部と本体で構成される

• 仕様部

• オブジェクトの呼び出し方法の記述• グローバル変数やユーザー定義タイプ(配列、連想配列、カーソルタイプ・・・)の宣言も行う

• 本体

• プロシージャーやファンクションを実装

CREATE MODULE moo@

ALTER MODULE moo PUBLISH PROCEDURE prot(IN a INT, IN b BIGINT, IN c VARCHAR(20))LANGUAGE SQL@

ALTER MODULE moo ADD PROCEDURE prot(IN a INT, IN b BIGINT, IN c VARCHAR(20))BEGINDECLARE stmt VARCHAR(1000);DECLARE c1 CURSOR WITH RETURN FOR sl;SET stmt = 'SELECT 1 FROM (values(1))';PREPARE sl FROM stmt;OPEN c1;END@

仕様部仕様部仕様部仕様部

本体本体本体本体

Page 40: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

40 © 2009 ISE Corporation

モジュールのメリット

• モジュール内オブジェクトの共用

• 変数、カーソル、型、例外、ローカルルーチンを共有できる

• 名前衝突の回避

• プロシージャー名、ファンクション名、変数名の衝突を回避できる

• 情報の隠蔽

• モジュール内のみで使用可能なオブジェクトの作成が可能

• 権限のコントロール

• モジュール単位に権限のgrant/revokeが可能

Page 41: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

41 © 2009 ISE Corporation

モジュールとPL/SQL

• PL/SQLでパッケージを作成するとモジュールとして登録される

• PL/SQLではモジュールと同じ機能をパッケージで提供している

C:¥work>db2 -tvf modtest.sqlset sqlcompat db2DB20000I SET SQLCOMPAT コマンドが正常に完了しました。

create module mod1DB20000I SQL コマンドが正常に完了しました。

alter module mod1 publish variable var1 int default 0DB20000I SQL コマンドが正常に完了しました。

alter module mod1 publish procedure printDB20000I SQL コマンドが正常に完了しました。

alter module mod1 publish procedure plus(in p1 int)DB20000I SQL コマンドが正常に完了しました。

alter module mod1 publish function get() returns intDB20000I SQL コマンドが正常に完了しました。

alter module mod1 add procedure print begin call dbms_output.put_line(var1); endDB20000I SQL コマンドが正常に完了しました。

alter module mod1 add procedure plus(in p1 int default 1) begin set var1 = var1 + p1; endDB20000I SQL コマンドが正常に完了しました。

alter module mod1 add function get() returns int return var1DB20000I SQL コマンドが正常に完了しました。

CC:¥work>db2 -tvf pkgtest.sqlset sqlcompat plsqlDB20000I SET SQLCOMPAT コマンドが正常に完了しました。

create or replace package pkg1 isvar1 int :=0;procedure print;procedure plus(p1 in int);function get return int;

end;

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

create or replace package body pkg1 isprocedure print isbegin

dbms_output.put_line(var1);end;procedure plus(p1 in varchar2 default 1) isbegin

var1 := var1 + p1;end;function get return int isbeginreturn var1;

end;end;

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

SQL PLでモジュールを作成

・CREATE MODULE文でModuleを作成後、ALTER MODULE文で仕様部、本体を追加する

PL/SQLでパッケージ(モジュール)を作成

・CREATE PACKAGE文、CREATE PACKAGE BODY文を使用して作成

仕様部仕様部仕様部仕様部

本体本体本体本体

仕様部仕様部仕様部仕様部

本体本体本体本体

Page 42: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

42 © 2009 ISE Corporation

モジュールに関するシステムカタログ

• SYSCAT.MODULES

• モジュール情報

• SYSCAT.MODULEOBJECTS

• モジュールに含まれるオブジェクト情報

select char(modulename,5) modulename,dialect,moduletype from syscat.modules where modulename in ('PKG1','MOD1')

MODULENAME DIALECT MODULETYPE---------- ---------- ----------MOD1 DB2 SQL PL MPKG1 PL/SQL P

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

select char(objectmodulename,10) objectmodulename,char(objectname,20) objectname,objecttype,published from syscat.moduleobjectswhere objectmodulename in ('PKG1','MOD1') order by 1

OBJECTMODULENAME OBJECTNAME OBJECTTYPE PUBLISHED---------------- -------------------- ---------- ---------MOD1 VAR1 VARIABLE YMOD1 PLUS PROCEDURE YMOD1 GET FUNCTION YMOD1 PRINT PROCEDURE YPKG1 VAR1 VARIABLE YPKG1 GET FUNCTION YPKG1 PRINT PROCEDURE YPKG1 PLUS PROCEDURE Y

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

PL/SQL PackageにはPが入る

SQL PL作成されたModuleにはMが入る

MOD1に含まれるオブジェクト

PKG1に含まれるオブジェクト

参照例

Page 43: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

43 © 2009 ISE Corporation

モジュールへのdb2lookの対応

• db2lookのののの-modオプションオプションオプションオプションによりによりによりによりモジュールモジュールモジュールモジュールののののDDLのののの生成生成生成生成がががが可能可能可能可能

• -modオプション

-mod: Generate DDL statements for Module

このオプションは、-e および -x/xd オプションとともに使用できます。

C:¥SQLLIB¥samples¥sqlpl>db2look -d testdb -e -mod-- USER は以下のとおりです: DB2ADMIN-- 表の DDL の作成-- この CLP ファイルの作成に使用した DB2LOOK のバージョン: "9.7"-- タイム・スタンプ: 2009/05/19 23:18:34-- データベース名: TESTDB-- データベース・マネージャーのバージョン: DB2/NT Version 9.7.0-- データベース・コード・ページ: 1208-- データベース照合シーケンス: SYSTEM_943

CONNECT TO TESTDB;

-------------------------------------------------------------モジュール・サポートの DDL ステートメント "DB2ADMIN"."PKG1"

-------------------------------------------------------------create or replace package pkg1 is

var1 int :=0;procedure print;procedure plus(p1 in int);function get return int;

end;;create or replace package body pkg1 is・・・

-------------------------------------------------------------モジュール・サポートの DDL ステートメント "DB2ADMIN"."MOD1"

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

CREATE MODULE "DB2ADMIN"."MOD1";SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","SOTA";

alter module mod1 publish variable var1 int default 0;SET CURRENT SCHEMA = "DB2ADMIN";SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","SOTA";

alter module mod1 PUBLISH procedure print ;

SET CURRENT SCHEMA = "DB2ADMIN";SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","SOTA";

alter module mod1 PUBLISH procedure plus(in p1 int default 1) ;

SET CURRENT SCHEMA = "DB2ADMIN";SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","SOTA";

・・・・

DDL生成例

続き

Page 44: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

44 © 2009 ISE Corporation

モジュール制限事項

• モジュール内の個別のオブジェクトに特権を付与することはできません。モジュールに付与、またはモジュールから取り消せるのは、EXECUTE 特権だけです。

• モジュールに含めることができるのは以下のデータベース・オブジェクトの定義だけです。

• SQL プロシージャー

• SQL 関数

• 外部プロシージャー

• 外部関数

• 作成済み条件

• モジュール初期化の際に暗黙的に実行されるモジュール初期化プロシージャー

• ユーザー定義のデータ・タイプ定義 (特殊タイプ、配列タイプ、連想配列タイプ、行タイプ、およびカーソル・タイプが含まれます)

• すべてのデータ・タイプのグローバル変数

• モジュールの初期化に使用する SYS_INIT 初期化プロシージャーは、パラメーターを参照したり、結果セットを戻したりすることはできません。

• Data Studio ツールまたはコントロール・センター・ツールから、モジュールの定義、変更、初期化、またはドロップを行うことはできません。

• 今回のバージョンでは、モジュールの使用に関して以下の制約事項が適用されます。

• 初期化プロシージャーの定義および実行はできません。

Page 45: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

45 © 2009 ISE Corporation

まとめ

• Oracle互換機能強化概要

• DB2_COMPATIBILITY_VECTOR

• データタイプの互換性

• スカラー関数の機能強化

• ビルトイン・パッケージ・ライブラリー

• PL/SQLサポート

• パッケージ(モジュール)のサポート

Page 46: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

46 © 2009 ISE Corporation

ブランクブランクブランクブランク・・・・ページページページページ

Page 47: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

47 © 2009 ISE Corporation

参考資料参考資料

Page 48: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

48 © 2009 ISE Corporation

参考資料内容

• Weak Typing

• Public Synonym

• 作成済作成済作成済作成済みみみみ一時表一時表一時表一時表

• DB2_COMPATIBILITY_VECTORでででで有効有効有効有効にににに出来出来出来出来るるるる機能機能機能機能

• ROWNUM

• 外部結合演算子(+)

• 階層照会

• NUMBER データ・タイプ

• VARCHAR2 データ・タイプ

• DATE データ・タイプ

• TRUNCATE TABLE

• 文字リテラル

• コレクション・メソッド

• データ・ディクショナリー互換ビュー

• PL/SQL のコンパイル

Page 49: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

49 © 2009 ISE Corporation

• DB2 9.5まではまではまではまではstrict(厳密厳密厳密厳密なななな))))データタイピングデータタイピングデータタイピングデータタイピング

• トレンドはweak(緩やかな)タイピング (PERL, RUBY, PHP, …)

• DB2 9.7でのでのでのでの新新新新しいしいしいしい振振振振るるるる舞舞舞舞いいいい

• 数値と文字列間の暗黙的な変換(cast):

• 割当てSET salary := ‘52000’

• 比較WHERE salary > ‘52000’

• ビルトイン関数での利用‘salary: ‘ || 52000 (文字列連結の例)

• NULL やパラメーター・マーカーの利用性向上

• 非型付きパラメーター・マーカーとNULLを伴う関数呼び出し

• この振る舞いにより、明示的なキャストが不要になりステートメント量が少なくなります。

Weak Typing

Page 50: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

50 © 2009 ISE Corporation

暗黙的な変換の例

$ db2 select "* from itest_w where salarysalarysalarysalary > '10000'“

SQL0401N The data types of the operands for the operation ">" are not compatible. SQLSTATE=42818

$ db2 select "* from itest_w where salarysalarysalarysalary > '10000'"

NAME SALARY---------------- -----------TEST 200000

1 record(s) selected.

V9.7

V9.5INTEGER型で定

義している。

エラーエラーエラーエラー

OKOK

NumericとString間の暗黙的な変換。

Page 51: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

51 © 2009 ISE Corporation

非型付きパラメーター・マーカーのデータタイプ判別

• 非型付きパラメーター・マーカー• データタイプ指定されていないパラメーター・マーカー

• 例: select * from t1 where c1 = ?、 values ?

• PREPARE時にコンテキストからデータタイプが判別できない場合にはエラーとなる• select * from t1 where c1 = ? → PREPARE時に列C1のタイプからパラメーター・マーカーのタイプを判

• values ? → PREPARE時にはデータタイプの判別が出来ないためエラー

• V9.7より

• 非型付きパラメーター・マーカーのデータタイプ判別をOPEN、EXECUTE時まで据え置き、パラメーター・マーカーの入力値に基づいたデータ・タイプの判別を行わせることが出来る

• この機能を使用するには以下の条件が必要• PREPAREが実行され、据え置き準備(DeferredPrepare)の使用が有効になっている

• レジストリ変数DB2_DEFERRED_PREPARE_SEMANTICS=YESが設定されている

• DB2_DEFERRED_PREPARE_SEMANTICS=YESはUnicode,SBCS環境でのみの推奨値

型付きパラメーター・マーカー・CAST関数によって明示的に型指定が行われているパラメーターマーカー・例:values cast(? as char(20))

Page 52: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

52 © 2009 ISE Corporation

C:¥work>java test5Prepare !SQL : values ?Execute !DATA : 111------------------------------------------------------------C:¥work>java test5SQL : values ?Prepare !Execute !ステートメントで型なしパラメーター・マーカーが使用されているか、無効な NULL 値が含まれています。. SQLCODE=-418, SQLSTATE=42610, DRIVER=3.57.82-------------------------------------------------------------C:¥work>java test5SQL : values ?Prepare !ステートメントで型なしパラメーター・マーカーが使用されているか、無効な NULL 値が含まれています。. SQLCODE=-418, SQLSTATE=42610, DRIVER=3.57.82

非型付きパラメーター・マーカーのデータタイプ判別テスト

• 以下以下以下以下ののののSQLををををDB2_DEFERRED_PREPARE_SEMANTICSとdeferPreparesの設定を変えて実行。

• SQL:values ? (パラメータマーカーにはsetStringで"111"を設定)

DB2_DEFERRED_PREPARE_SEMANTICS=YESdeferPrepares=true

この二つのパラメーターが設定されている場合には、パラメーター・マーカーの入力値から、データタイプが判別されて、SQLの実行が成功します。

DB2_DEFERRED_PREPARE_SEMANTICS=YESdeferPrepares=falsedeferPrepares=falseによりPrepareが先に行われるためパラメーター・マーカーの入力値が使用できずエラーとなります

DB2_DEFERRED_PREPARE_SEMANTICS=NOdeferPrepares=true

パラメーター・マーカーの入力値からのデータタイプ判別が行われずエラーとなります

OKOK

エラーエラーエラーエラー

エラーエラーエラーエラー

Page 53: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

53 © 2009 ISE Corporation

Public Synonym(ALIASの機能拡張)

• V9.7からからからから

• Public Aliasを使用できる

• スキーマなしでの呼び出しでCURRENT SCHEMAと関係なくオブジェクトの参照が可能

• 1ステートメント(CREATE PUBLIC ALIAS)で全てのユーザーにオブジェクトが公開できる

• Aliasを付けられるオブジェクトが増えた

• Alias (PrivateまたはPublic)、ニックネーム、モジュール、シーケンス、表、ビュー

• CREATE [PUBLIC] SYNONYM文を使用して作成可能

• V9.5までまでまでまで

• Private Aliasのみ使用可能

• Aliasを付けられるオブジェクト

• 他のPrivate Alias、ニックネーム、表、またはビューに対して別名を定義可能

V9.7 New

Page 54: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

54 © 2009 ISE Corporation

Public Synonym(Public Alias)使用例

• CREATE PUBLIC SYNONYM文文文文をををを使使使使用用用用してしてしてしてPublic Aliasをををを作成作成作成作成しししし、、、、他他他他ののののユーユーユーユーザーザーザーザーからからからからPublic Aliasをををを参照参照参照参照していますしていますしていますしています

values current schema

1----------------------------------------------------DB2ADMIN

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

create table t1 (c1 char(20))DB20000I SQL コマンドが正常に完了しました。

grant all on t1 to publicDB20000I SQL コマンドが正常に完了しました。

insert into t1 values ('db2admin')DB20000I SQL コマンドが正常に完了しました。

create public synonym p_t1 for t1create public synonym p_t1 for t1create public synonym p_t1 for t1create public synonym p_t1 for t1DB20000I SQL コマンドが正常に完了しました。

values current schema

1-------------------------------------------------USER1

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

select * from p_t1

C1--------------------db2admin

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

create table p_t1(c1 char(20))DB20000I SQL コマンドが正常に完了しました。

insert into p_t1 values ('user1')DB20000I SQL コマンドが正常に完了しました。

select * from p_t1

C1--------------------user1

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

select * from syspublicsyspublicsyspublicsyspublic.p_t1

C1--------------------db2admin

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

DB2ADMINスキーマのT1表の Public Alias P_T1を作成

スキーマ指定なしで呼び出すとPublic Aliasが参照される

Public Aliasと同じオブジェクトがスキーマ内にある場合はスキーマないのオブジェクトが参照される

Public AliasはSYSPUBLICスキーマ

に作成されます。明示的にスキーマを指定してPublic Aliasにアクセスすることも可能

Public Alias作成

他のユーザーから参照

Page 55: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

55 © 2009 ISE Corporation

作成済み一時表

• V9.7よりよりよりより作成済作成済作成済作成済みみみみ一時表一時表一時表一時表がががが使用可能使用可能使用可能使用可能

• CREATE GLOBAL TEMPORARY TABLE文で作成済み一時表を作成

• 作成された定義はカタログに格納され、複数のセッションからの定義定義定義定義の共有が可能

• V9.5までは、宣言済み一時表の使用のみ可能

ユーザー一時表スペースユーザー一時表スペース表スペース

索引追加可能、表と同じ表スペースに配置索引追加可能、表と同じ表スペースに配置索引

ロッキング、リカバリーは行われません。

LOGGEDが指定されていれば、ローバックは可能

ロッキング、リカバリーは行われません。

LOGGEDが指定されていれば、ローバックは可能

ロッキング、リカバリー

セッション内のみで有効

コミット毎に行の削除または残す設定が可能

セッション内のみで有効

コミット毎に行の削除または残す設定が可能

データの永続性

SESSIONスキーマに作成される指定可能スキーマ

なし表特権の付与、取り消しが可能表特権

セッション毎に独立してアクセス、SQLによるアクセスが可能セッション毎に独立してアクセス、SQLによるアクセスが可能データへのアクセス

カタログには格納されず、セッション毎に宣言し、作成が必要カタログに格納される。一度作成しておけば使用時の宣言や作成は不要

定義

DECLARE GLOBAL TEMPORARY TABLE文CREATE GLOBAL TEMPORARY TABLE文作成ステートメント

宣言済み一時表作成済み一時表

作成済み一時表と宣言済み一時表の比較

Page 56: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

56 © 2009 ISE Corporation

作成済み一時表使用例

• 作成済作成済作成済作成済みみみみ一時表一時表一時表一時表をををを作成作成作成作成しししし、、、、複数複数複数複数ののののセッションセッションセッションセッションからからからから使用使用使用使用

C:¥>db2 -tvf temptable.sqlcreate user temporary tablespace usertempDB20000I SQL コマンドが正常に完了しました。

create global temporary table temptab1 (c1 int,c2 create global temporary table temptab1 (c1 int,c2 create global temporary table temptab1 (c1 int,c2 create global temporary table temptab1 (c1 int,c2 intintintint) ) ) ) in in in in usertempusertempusertempusertemp on commit preserve rows loggedon commit preserve rows loggedon commit preserve rows loggedon commit preserve rows loggedDB20000I SQL コマンドが正常に完了しました。

list tables

表/ビュー スキーマ タイプ 作成時刻---------- ----------- ----- --------------------------

TEMPTAB1 DB2ADMIN GGGG 2009-06-28-12.03.19.718002

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

C:¥>db2 connect to test1 user db2admin using db2admin

データベース接続情報

データベース・サーバー = DB2/NT 9.7.0SQL 許可 ID = DB2ADMINローカル・データベース別名 = TEST1

C:¥>db2 "insert into temptab1 values (2,2)"DB20000I SQL コマンドが正常に完了しました。

C:¥>db2 "select * from temptab1"

C1 C2----------- -----------

2 2

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

C:¥>db2 connect to test1 user db2admin using db2admin

データベース接続情報

データベース・サーバー = DB2/NT 9.7.0SQL 許可 ID = DB2ADMINローカル・データベース別名 = TEST1

C:¥>db2 "insert into temptab1 values (1,1)"DB20000I SQL コマンドが正常に完了しました。

C:¥>db2 "select * from temptab1"

C1 C2----------- -----------

1 1

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

セッションAから作成済み一時表を使用

セッションBから作成済み一時表を使用

作成済み一時表の作成

作成済み一時表はカタログに定義が格納されているため、LIST TABLESにも出力される

タイプはGになる

セッション毎にデータは独立しています。

Page 57: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

57 © 2009 ISE Corporation

ROWNUM擬似列

• 行番号をを返す擬似列を使用できる

• 行番号による絞込みなどに使用されます。例:20行目から30行目までを返す。

• DB2_COMPATIBILITY_VECTOR=001でこの機能を有効にします

• ROWNUM を ROW_NUMBER() OVER() の同義語として使用することを可能にします

• データベース作成後でも有効にできます

PL/SQL のコンパイル12 (0x800)データ・ディクショナリー互換ビュー11 (0x400)コレクション・メソッド10 (0x200)文字リテラル9 (0x100)TRUNCATE TABLE8 (0x80)DATE データ・タイプ7 (0x40)VARCHAR2 データ・タイプ6 (0x20)NUMBER データ・タイプ5 (0x10)階層照会4 (0x08)外部結合演算子3 (0x04)未使用2 (0x02)ROWNUM1 (0x01)互換性フィーチャービット位置

Page 58: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

58 © 2009 ISE Corporation

ROWNUMの使用例

C:¥>db2 "select id,name from staff where rownumrownumrownumrownum <= 10"

ID NAME------ ---------

10 Sanders20 Pernal30 Marenghi40 O'Brien50 Hanes60 Quigley70 Rothman80 James90 Koonitz100 Plotz

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

C:¥>db2 "select id,name from staff where rownumrownumrownumrownum between 5 and 10"

ID NAME------ ---------

50 Hanes60 Quigley70 Rothman80 James90 Koonitz100 Plotz

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

Optimized Statement:-------------------SELECT Q3.$C0 AS "ID", Q3.$C1 AS "NAME"FROM(SELECT Q2.$C0, Q2.$C1, ROWNUMBER() OVER ()

FROM(SELECT Q1."ID", Q1."NAME"FROM SOTA.STAFF AS Q1) AS Q2) AS Q3

WHERE (Q3.$C2 <= 10) AND (5 <= Q3.$C2)

Explainを取得してOptimized Statementを確認

10行目以下

までを選択

5行目から10行目

までを選択

Explainを取得してOptimized Statementを確認するとROWNUMBER() OVER()にREWRITEされているのがわかります

10行目までの行を返す 5行目から10行目までの行を返す

Page 59: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

59 © 2009 ISE Corporation

外部結合演算子(+)

• 外部結合演算子外部結合演算子外部結合演算子外部結合演算子 (+) をををを使用使用使用使用してしてしてして外部結合外部結合外部結合外部結合できますできますできますできます。。。。

• DB2_COMPATIBILITY_VECTOR=004でこのでこのでこのでこの機能機能機能機能をををを有効有効有効有効にしますにしますにしますにします

• データベースデータベースデータベースデータベース作成後作成後作成後作成後でもでもでもでも有効有効有効有効にできますにできますにできますにできます

PL/SQL のコンパイル12 (0x800)データ・ディクショナリー互換ビュー11 (0x400)コレクション・メソッド10 (0x200)文字リテラル9 (0x100)TRUNCATE TABLE8 (0x80)DATE データ・タイプ7 (0x40)VARCHAR2 データ・タイプ6 (0x20)NUMBER データ・タイプ5 (0x10)階層照会4 (0x08)外部結合演算子3 (0x04)未使用2 (0x02)ROWNUM1 (0x01)互換性フィーチャービット位置

Page 60: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

60 © 2009 ISE Corporation

外部結合演算子(+)使用例

• 外部結合外部結合外部結合外部結合をををを行行行行うううう結合条件結合条件結合条件結合条件にににに外部結合演算子外部結合演算子外部結合演算子外部結合演算子(+)をををを付付付付けるけるけるける

C:¥>db2 "select deptno,deptname,empno from dept ,emp where deptno = workdept(+)(+)(+)(+)"

DEPTNO DEPTNAME EMPNO------ ------------------------------------ ------A00 SPIFFY COMPUTER SERVICE DIV. 000010B01 PLANNING 000020・・・省略・・・E21 SOFTWARE SUPPORT 200330E21 SOFTWARE SUPPORT 200340H22 BRANCH OFFICE H2 -I22 BRANCH OFFICE I2 -G22 BRANCH OFFICE G2 -D01 DEVELOPMENT CENTER -F22 BRANCH OFFICE F2 -J22 BRANCH OFFICE J2 -

48 レコードが選択されました。 Optimized Statement:-------------------SELECT Q2."DEPTNO" AS "DEPTNO", Q2."DEPTNAME" AS "DEPTNAME", Q1."EMPNO" AS "EMPNO"FROM SOTA.EMPLOYEE AS Q1 RIGHT OUTER JOIN RIGHT OUTER JOIN RIGHT OUTER JOIN RIGHT OUTER JOIN SOTA.DEPARTMENT AS Q2 ON (Q2."DEPTNO" = Q1."WORKDEPT")

Explainを取得し、Optimized Statementを参照すると

OUTER JOIN句を使用した文にREWRITEされている

外部結合により、結合条件に合致しない行も表示

Page 61: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

61 © 2009 ISE Corporation

階層照会

• CONNECT BY 節を使用した階層照会のサポートを有効にします。

• DB2_COMPATIBILITY_VECTOR=008でこの機能を有効にします

• データベース作成後でも有効にできます

PL/SQL のコンパイル12 (0x800)データ・ディクショナリー互換ビュー11 (0x400)コレクション・メソッド10 (0x200)文字リテラル9 (0x100)TRUNCATE TABLE8 (0x80)DATE データ・タイプ7 (0x40)VARCHAR2 データ・タイプ6 (0x20)NUMBER データ・タイプ5 (0x10)階層照会4 (0x08)外部結合演算子3 (0x04)未使用2 (0x02)ROWNUM1 (0x01)互換性フィーチャービット位置

Page 62: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

62 © 2009 ISE Corporation

階層照会 使用例

• 以下以下以下以下のののの句句句句をををを指定指定指定指定してしてしてして取取取取りりりり出出出出すすすす階層階層階層階層をををを指定指定指定指定するするするする

• START WITH句でルートになる条件を指定

• CONNECT BY句で親子の関係を表す条件を指定

• PRIOR演算子を使用して親の列を参照できる

• 階層照会階層照会階層照会階層照会ではではではでは以下以下以下以下のようなのようなのようなのような擬似列擬似列擬似列擬似列、、、、関数関数関数関数のののの使用使用使用使用がががが可能可能可能可能

• LEVEL擬似列

• 階層照会でこの行のルートからの階層数を返す

• SYS_CONNECT_BY_PATH関数

• 階層照会でルート行からこの行までのパスを表すストリングを作成

select deptno, deptname, levellevellevellevel,char(sys_connect_by_pathsys_connect_by_pathsys_connect_by_pathsys_connect_by_path(deptno,'/'),30) hierarchy from department start withstart withstart withstart with deptno = 'A00' connect byconnect byconnect byconnect by priorpriorpriorprior deptno = admrdept and deptno !='A00'

DEPTNO DEPTNAME LEVEL HIERARCHY------ ---------------------------------- ----------- ----------------A00 SPIFFY COMPUTER SERVICE DIV. 1 /A00B01 PLANNING 2 /A00/B01C01 INFORMATION CENTER 2 /A00/C01D01 DEVELOPMENT CENTER 2 /A00/D01D11 MANUFACTURING SYSTEMS 3 /A00/D01/D11D21 ADMINISTRATION SYSTEMS 3 /A00/D01/D21E01 SUPPORT SERVICES 2 /A00/E01E11 OPERATIONS 3 /A00/E01/E11E21 SOFTWARE SUPPORT 3 /A00/E01/E21・・・省略・・・

DEPTNO DEPTNAME MGRNO ADMRDEPT LOCATION------ ------------------------------ ------ -------- --------A00 SPIFFY COMPUTER SERVICE DIV. 000010 A00 -B01 PLANNING 000020 A00 -C01 INFORMATION CENTER 000030 A00 -D01 DEVELOPMENT CENTER - A00 -D11 MANUFACTURING SYSTEMS 000060 D01 -D21 ADMINISTRATION SYSTEMS 000070 D01 -E01 SUPPORT SERVICES 000050 A00 -E11 OPERATIONS 000090 E01 -E21 SOFTWARE SUPPORT 000100 E01 -F22 BRANCH OFFICE F2 - E01 -・・・省略・・・

A00

B01 C01 D01

D11 D21

E01

E11 E21 ・・・

Department表データ

Department表の階層イメージ

Department表に対して階層照会を実施

上位の部門コード

Page 63: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

63 © 2009 ISE Corporation

データタイプの互換性

• Oracle固有固有固有固有ののののデータタイプデータタイプデータタイプデータタイプNUMBER,VARCHAR2,DATEタイプタイプタイプタイプのののの使用使用使用使用をををを可能可能可能可能にしますにしますにしますにします

• DB2_COMPATIBILITY_VECTOR

• NUMBERデータデータデータデータ・・・・タイプタイプタイプタイプのののの互換性互換性互換性互換性はははは010010010010

• データベース作成時に決定され、作成後は変更できません。

PL/SQL のコンパイル12 (0x800)データ・ディクショナリー互換ビュー11 (0x400)コレクション・メソッド10 (0x200)文字リテラル9 (0x100)TRUNCATE TABLE8 (0x80)DATE データ・タイプ7 (0x40)VARCHAR2 データ・タイプ6 (0x20)NUMBER データ・タイプ5 (0x10)階層照会4 (0x08)外部結合演算子3 (0x04)未使用2 (0x02)ROWNUM1 (0x01)互換性フィーチャービット位置

Page 64: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

64 © 2009 ISE Corporation

データタイプの互換性

• NUMBER,VARCHAR2,DATEのののの互換性互換性互換性互換性

• Oracleがサポートしている以下のデータタイプとの互換性をサポート• DATE• NUMBER• VARCHAR2

• データタイプデータタイプデータタイプデータタイプのののの互換性互換性互換性互換性をををを有効有効有効有効にするにはにするにはにするにはにするには、、、、DB2_COMPATIBILITY_VECTORのののの設定設定設定設定がががが必要必要必要必要

• データベース作成時に設定が行われている必要がある、データベース作成後は変更不可

• 以下のデータベース構成パラメーターの以下の項目で互換性サポートを有効化を確認できる

• NUMBER データ・タイプの互換性• VARCHAR2 データ・タイプの互換性• データ・タイプ DATE の TIMESTAMP(0) への互換性

C:¥>db2 get db cfg for sample | find "互換性"

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

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

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

確認例

Page 65: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

65 © 2009 ISE Corporation

TRUNCATE TABLE代替セマンティクス

• TRUNCATE ステートメント用の代替セマンティクスを有効にします。

• IMMEDIATE がオプションのキーワードであり、指定がない場合にデフォルトになります。

• TRUNCATE ステートメントが論理作業単位内の最初のステートメントではない場合、TRUNCATE ステートメントが実行される前に暗黙的なコミット操作が実行されます。

• DB2_COMPATIBILITY_VECTOR=080でこの機能を有効にします

• データベース作成後でも有効にできます

PL/SQL のコンパイル12 (0x800)データ・ディクショナリー互換ビュー11 (0x400)コレクション・メソッド10 (0x200)文字リテラル9 (0x100)TRUNCATE TABLE8 (0x80)DATE データ・タイプ7 (0x40)VARCHAR2 データ・タイプ6 (0x20)NUMBER データ・タイプ5 (0x10)階層照会4 (0x08)外部結合演算子3 (0x04)未使用2 (0x02)ROWNUM1 (0x01)互換性フィーチャービット位置

Page 66: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

66 © 2009 ISE Corporation

TRUNCATE TABLE代替セマンティクス

• このこのこのこの機能機能機能機能をををを有効有効有効有効にするとにするとにするとにするとTRUNCATE TABLE文文文文のののの以下以下以下以下のののの2222つのつのつのつの動作動作動作動作がががが変変変変わるわるわるわる

1.IMMEDIATEキーワードが必須ではなくなり、以下のような呼び出しが可能

• TRUNATE TABLE テーブルテーブルテーブルテーブル名名名名

2.トランザクション中でもTRUNCATE TABLE文実行前に暗黙的なコミットが行われ、TRUNCATE TABLE文が実行される

• この機能が無効の場合には、トランザクション中にTRUNCATE TABLEを発行するとエラーとなる(SQL0428N)

.-TABLE-. .-DROP STORAGE--. >>-TRUNCATE--+-------+--table-name--+---------------+----------->

'-REUSE STORAGE-'

.-IGNORE DELETE TRIGGERS--------. >--+-------------------------------+---------------------------->

'-RESTRICT WHEN DELETE TRIGGERS-'

.-CONTINUE IDENTITY-. >--+-------------------+--IMMEDIATE----------------------------><

TRUNCATE TABLE構文

IMMEDIATEキーワード

がオプションになる

Oracleと同じ構文で呼

び出しができる

Page 67: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

67 © 2009 ISE Corporation

TRUNCATE TABLE実行例

C:¥>db2 truncate table t1DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQLステートメントとして処理されました。SQL 処理中に、そのコマンドが返されました。SQL0104N "truncate table T1" SQL0104N "truncate table T1" SQL0104N "truncate table T1" SQL0104N "truncate table T1" にににに続続続続いていていていて予期予期予期予期しないしないしないしないトークントークントークントークン"END"END"END"END----OFOFOFOF----STATEMENT"STATEMENT"STATEMENT"STATEMENT"がががが見見見見つかりましたつかりましたつかりましたつかりました。。。。予期予期予期予期されたされたされたされたトークントークントークントークンにににに""""IMMEDIATEIMMEDIATEIMMEDIATEIMMEDIATE""""がががが含含含含まれているまれているまれているまれている可能性可能性可能性可能性がありますがありますがありますがあります。。。。SQLSTATE=42601SQLSTATE=42601SQLSTATE=42601SQLSTATE=42601

C:¥>db2 truncate table t1 immediateDB20000I SQL コマンドが正常に完了しました。

C:¥>db2 +c insert into t1 values (1,1)DB20000I SQL コマンドが正常に完了しました。

C:¥>db2 truncate table t1 immediateDB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQLステートメントとして処理されました。SQL 処理中に、そのコマンドが返されました。SQL0428N SQL SQL0428N SQL SQL0428N SQL SQL0428N SQL ステートメントステートメントステートメントステートメントはははは、、、、作業単位作業単位作業単位作業単位のののの最初最初最初最初ののののステートステートステートステートメントメントメントメントとしてのみとしてのみとしてのみとしてのみ許可許可許可許可されされされされていますていますていますています。。。。 SQLSTATE=25001SQLSTATE=25001SQLSTATE=25001SQLSTATE=25001

C:¥>db2 truncate table t1

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

C:¥>db2 +c insert into t1 values (1,1)

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

C:¥>db2 truncate table t1

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

ON OFF

トランザクション中でも実行可能

IMMEDIATEが必須のキーワードのため文法エラー

トランザクション中に実行するとSQL0428エラーでステートメントは失敗する

DB2_COMPATIBILITY_VECTOR=080の場合 DB2_COMPATIBILITY_VECTOR設定なしの場合

Page 68: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

68 © 2009 ISE Corporation

文字リテラルの互換性

• バイトバイトバイトバイト長長長長がががが 254 以下以下以下以下であるであるであるである文字定数文字定数文字定数文字定数およびおよびおよびおよび GRAPHIC ストリングストリングストリングストリング定数定数定数定数にににに、、、、CHAR データデータデータデータ・・・・タタタタイプイプイプイプまたはまたはまたはまたは GRAPHIC データデータデータデータ・・・・タイプタイプタイプタイプ (VARCHAR データデータデータデータ・・・・タイプタイプタイプタイプでもでもでもでも VARGRAPHIC デーデーデーデータタタタ・・・・タイプタイプタイプタイプでもないでもないでもないでもない) をををを割割割割りりりり当当当当てることをてることをてることをてることを可能可能可能可能にしますにしますにしますにします。。。。

• DB2_COMPATIBILITY_VECTOR=100でこのでこのでこのでこの機能機能機能機能をををを有効有効有効有効にしますにしますにしますにします

• データベース作成後でも有効にできます

PL/SQL のコンパイル12 (0x800)データ・ディクショナリー互換ビュー11 (0x400)コレクション・メソッド10 (0x200)文字リテラル9 (0x100)TRUNCATE TABLE8 (0x80)DATE データ・タイプ7 (0x40)VARCHAR2 データ・タイプ6 (0x20)NUMBER データ・タイプ5 (0x10)階層照会4 (0x08)外部結合演算子3 (0x04)未使用2 (0x02)ROWNUM1 (0x01)互換性フィーチャービット位置

Page 69: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

69 © 2009 ISE Corporation

文字リテラルの互換性

• 254文字以下文字以下文字以下文字以下のののの文字文字文字文字リテラルリテラルリテラルリテラルををををCHARとしてとしてとしてとして扱扱扱扱うううう。。。。

• Oracleでは、文字リテラルはCHARとして扱われる

• OracleでもCHARの比較は空白埋め比較セマンティクスが使用される

C:¥>db2 describe values 'A'

列情報

列の数: 1

SQL タイプ タイプ長 列名 名前長---------------- ----------- -------- -----------452 CHARACTER 1 1 1

C:¥>db2 "select 'TRUE' from dual where 'A' = 'A '"

1----TRUE

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

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

またはまたはまたはまたは文字文字文字文字リテラルリテラルリテラルリテラルのののの互換性互換性互換性互換性=ON

C:¥>db2 describe values 'A'

列情報

列の数: 1

SQL タイプ タイプ長 列名 名前長-------------- ----------- -------- -----------448 VARCHAR 1 1 1

C:¥>db2 "select 'TRUE' from sysibm.sysdummy1 where 'A' = 'A '"

1----TRUE

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

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

リテラルのタイプはCHARリテラルのタイプはVARCHAR

Page 70: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

70 © 2009 ISE Corporation

コレクション・メソッド

• 配列配列配列配列でででで first、、、、last、、、、next、、、、previous などのなどのなどのなどの演算演算演算演算をををを実行実行実行実行するするするするメソッドメソッドメソッドメソッドのののの使用使用使用使用をををを可能可能可能可能にしますにしますにしますにします。。。。またまたまたまた、、、、配列内配列内配列内配列内のののの特定特定特定特定のののの要素要素要素要素のののの参照参照参照参照にににに、、、、大括弧大括弧大括弧大括弧のののの代代代代わりにわりにわりにわりに括弧括弧括弧括弧をををを使用使用使用使用できるようにしますできるようにしますできるようにしますできるようにします。。。。例例例例えばえばえばえば、、、、array1(i) はははは array1 のののの要素要素要素要素 i をををを参照参照参照参照しますしますしますします。。。。

• DB2_COMPATIBILITY_VECTOR=200でこのでこのでこのでこの機能機能機能機能をををを有効有効有効有効にしますにしますにしますにします

• データベース作成後でも有効にできます

PL/SQL のコンパイル12 (0x800)データ・ディクショナリー互換ビュー11 (0x400)コレクション・メソッド10 (0x200)文字リテラル9 (0x100)TRUNCATE TABLE8 (0x80)DATE データ・タイプ7 (0x40)VARCHAR2 データ・タイプ6 (0x20)NUMBER データ・タイプ5 (0x10)階層照会4 (0x08)外部結合演算子3 (0x04)未使用2 (0x02)ROWNUM1 (0x01)互換性フィーチャービット位置

Page 71: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

71 © 2009 ISE Corporation

コレクション・メソッド

• PL/SQL コレクションコレクションコレクションコレクション とはとはとはとは

• 同じデータ・タイプを持つ、配列されたデータ・エレメントの集合。その集合内の個々のデータ項目を、括弧を使用した添字表記法を使用して参照できます。

• VARRAY、連想配列

• コレクションメソッドコレクションメソッドコレクションメソッドコレクションメソッド

• コレクションの情報を参照したり、変更を行う機能

• 以下のようなメソッドがあります。

コレクションの末尾から、エレメントを n 個削除します。連想配列コレクション・タイプからエレメントをトリムすることはできません。TRIM (n)

コレクションの末尾から、エレメントを 1 つだけ削除します。連想配列コレクション・タイプからエレメントをトリムすることはできません。TRIM

指定したエレメントの直前に位置するエレメントの索引番号を返します。PRIOR (n)

指定したエレメントの直後に位置するエレメントの索引番号を返します。NEXT (n)

VARRAY の場合にはエレメントの最大数、ネストした表の場合には NULL を返します。LIMIT

コレクション内にある最大の索引番号を返します。LAST

コレクション内にある最小の索引番号を返します。FIRST

コレクションに、n2 番目のエレメントのコピーを n1 個付加します。EXTEND (n1, n2)

コレクションに NULL エレメントを n 個付加します。EXTEND (n)

コレクションに NULL エレメントを 1 つだけ付加します。EXTEND

指定したエレメントが存在する場合は、TRUE を返します。EXISTS (n)

n1 から n2 までのエレメントすべてを、連想配列から削除します。 VARRAY コレクション・タイプから個々のエレメントを削除することはできません。DELETE (n1, n2)

連想配列からエレメント n を削除します。 VARRAY コレクション・タイプから個々のエレメントを削除することはできません。DELETE (n)

コレクションからすべてのエレメントを削除します。DELETE

コレクション内のエレメントの数を返します。COUNT

説明コレクション・メソッド

Page 72: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

72 © 2009 ISE Corporation

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

• Oracleのデータ・ディクショナリー互換ビューの作成を可能にします。

• DB2_COMPATIBILITY_VECTOR=400でこの機能を有効にします

• この機能を有効にするとデータベース作成時に、自動的にOracleのデータ・ディクショナリー互換ビューを作成されます。

• データベース作成時に作成されるため、デーベース作成時に設定されている必要があります

PL/SQL のコンパイル12 (0x800)データ・ディクショナリー互換ビュー11 (0x400)コレクション・メソッド10 (0x200)文字リテラル9 (0x100)TRUNCATE TABLE8 (0x80)DATE データ・タイプ7 (0x40)VARCHAR2 データ・タイプ6 (0x20)NUMBER データ・タイプ5 (0x10)階層照会4 (0x08)外部結合演算子3 (0x04)未使用2 (0x02)ROWNUM1 (0x01)互換性フィーチャービット位置

Page 73: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

73 © 2009 ISE Corporation

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

• 右の表にあるビューが作成される

• それぞれのビューにはPublic Aliasが作成されているため、スキーマ指定なしでも呼び出し可能

• ネーミング・ルール

• USER_*

• ユーザーのオブジェクトを表示

• ALL_*

• ユーザーがアクセス可能なオブジェクトを表示

• DBA_*

• 全てのオブジェクトを表示

• 右のオブジェクト以外にも以下のオブジェクトも作成される

• TABS :USER_TABLESのALIAS

• IND :USER_INDEXESのALIAS

• COLS :USER_TAB_COLUMNSのALIAS

• SIN :USER_SYNONYMSのALIAS

• SEQ :USER_SEQUENCESのALIAS

• DICT :DICTIONARYのALIAS

• OBJ :USER_OBJECTSのALIAS

• CAT :USER_CATALOGのALIAS

• TAB :ユーザーのテーブルを表示(スキーマ名とテーブル名とテーブルタイプのみの列を持つ)

USER_PROCEDURES、DBA_PROCEDURES、ALL_PROCEDURESUSER_SOURCE、DBA_SOURCE、ALL_SOURCEUSER_TRIGGERS、DBA_TRIGGERS、ALL_TRIGGERSUSER_ERRORS、DBA_ERRORS、ALL_ERRORSUSER_ARGUMENTS、DBA_ARGUMENTS、ALL_ARGUMENTS

プログラミング・オブジェクト

USER_ROLE_PRIVS、DBA_ROLE_PRIVS、ROLE_ROLE_PRIVSSESSION_ROLESUSER_SYS_PRIVS、DBA_SYS_PRIVS、ROLE_SYS_PRIVSSESSION_PRIVSUSER_TAB_PRIVS、DBA_TAB_PRIVS、ALL_TAB_PRIVS、ROLE_TAB_PRIVSUSER_TAB_PRIVS_MADE、ALL_TAB_PRIVS_MADEUSER_TAB_PRIVS_RECD、ALL_TAB_PRIVS_RECDDBA_ROLES

セキュリティー

USER_CONSTRAINTS、DBA_CONSTRAINTS、ALL_CONSTRAINTSUSER_CONS_COLUMNS、DBA_CONS_COLUMNS、ALL_CONS_COLUMNSUSER_INDEXES、DBA_INDEXES、ALL_INDEXESUSER_IND_COLUMNS、DBA_IND_COLUMNS、ALL_IND_COLUMNSUSER_TAB_PARTITIONS、DBA_TAB_PARTITIONS、ALL_TAB_PARTITIONSUSER_PART_TABLES、DBA_PART_TABLES、ALL_PART_TABLESUSER_PART_KEY_COLUMNS、DBA_PART_KEY_COLUMNS、ALL_PART_KEY_COLUMNSUSER_SYNONYMS、DBA_SYNONYMS、ALL_SYNONYMSUSER_TABLES、DBA_TABLES、ALL_TABLESUSER_TAB_COMMENTS、DBA_TAB_COMMENTS、ALL_TAB_COMMENTSUSER_TAB_COLUMNS、DBA_TAB_COLUMNS、ALL_TAB_COLUMNSUSER_COL_COMMENTS、DBA_COL_COMMENTS、ALL_COL_COMMENTSUSER_TAB_COL_STATISTICS、DBA_TAB_COL_STATISTICS、ALL_TAB_COL_STATISTICSUSER_VIEWS、DBA_VIEWS、ALL_VIEWSUSER_VIEW_COLUMNS、DBA_VIEW_COLUMNS、ALL_VIEW_COLUMNS

表またはビュー

DICTIONARY、DICT_COLUMNSUSER_CATALOG、DBA_CATALOG、ALL_CATALOGUSER_DEPENDENCIES、DBA_DEPENDENCIES、ALL_DEPENDENCIESUSER_OBJECTS、DBA_OBJECTS、ALL_OBJECTSUSER_SEQUENCES、DBA_SEQUENCES、ALL_SEQUENCESUSER_TABLESPACES、DBA_TABLESPACES

一般

定義定義定義定義されているされているされているされているビュービュービュービューカテゴカテゴカテゴカテゴリーリーリーリー

Page 74: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

74 © 2009 ISE Corporation

データディクショナリー互換ビュー使用例

C:¥>db2 select char(tschema,20) tschema,char(tname,20) tname,char(tabtype) tabtype from tabtabtabtab

TSCHEMA TNAME TABTYPE------------------- ------------------- -----------------DB2ADMIN CL_SCHED TABLEDB2ADMIN DEPARTMENT TABLEDB2ADMIN EMPLOYEE TABLEDB2ADMIN EMP_PHOTO TABLEDB2ADMIN EMP_RESUME TABLEDB2ADMIN PROJECT TABLEDB2ADMIN IN_TRAY TABLEDB2ADMIN ORG TABLEDB2ADMIN STAFF TABLEDB2ADMIN SALES TABLEDB2ADMIN EMP_ACT TABLEDB2ADMIN STAFFG TABLE

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

C:¥>db2 select char(index_name,20) index_name,char(index_type,20) index_type,char(table_name,20) table_name from user_indexesuser_indexesuser_indexesuser_indexes where table_name = 'CUSTOMER'

INDEX_NAME INDEX_TYPE TABLE_NAME-------------------- -------------------- --------------------SQL090627173927420 XRGN CUSTOMERSQL090627173928650 XVIP CUSTOMERCUST_PHONET_XMLIDX XVIL CUSTOMERSQL090627173928640 XVIP CUSTOMERCUST_PHONES_XMLIDX XVIL CUSTOMERSQL090627173928590 XVIP CUSTOMERCUST_NAME_XMLIDX XVIL CUSTOMERSQL090627173928530 XVIP CUSTOMERCUST_CID_XMLIDX XVIL CUSTOMERPK_CUSTOMER REG CUSTOMERSQL090627173927530 XPTH CUSTOMERSQL090627173927510 XPTH CUSTOMER

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

データディクショナリーのTABを参照

→ユーザーのテーブルを参照

データディクショナリーのUSER_INDEXESを参照

→CUSTOMER表のインデックスを参照

Page 75: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

75 © 2009 ISE Corporation

PL/SQLのコンパイル

• PL/SQLののののコンパイルコンパイルコンパイルコンパイルをををを可能可能可能可能にしますにしますにしますにします。。。。

• DB2_COMPATIBILITY_VECTOR=800でこのでこのでこのでこの機能機能機能機能をををを有効有効有効有効にしますにしますにしますにします

• データベース作成後でも有効にできます

PL/SQL のコンパイル12 (0x800)データ・ディクショナリー互換ビュー11 (0x400)コレクション・メソッド10 (0x200)文字リテラル9 (0x100)TRUNCATE TABLE8 (0x80)DATE データ・タイプ7 (0x40)VARCHAR2 データ・タイプ6 (0x20)NUMBER データ・タイプ5 (0x10)階層照会4 (0x08)外部結合演算子3 (0x04)未使用2 (0x02)ROWNUM1 (0x01)互換性フィーチャービット位置

Page 76: Oracle 互換(前半) - IBM• Oracle との互換機能を暼効にするレジストリ変数 • Oracle 互換機能の中にはこのレジストリ変数の設定が必要なものがあります。•

76 © 2009 ISE Corporation

DB2_COMPATIBILITY_VECTOR=800の設定

• DB2_COMPATIBILITY_VECTOR=800をををを設定設定設定設定することですることですることですることでPL/SQLをををを処理処理処理処理できるようになるできるようになるできるようになるできるようになる

C:¥work>db2 -tvf plsqltest2.sql!db2set |findstr DB2_COMPATIBILITY_VECTOR

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

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

declarev1 varchar(100) := 'PL/SQL Test';

begindbms_output.put_line(v1);

end;

DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQLステートメントとして処理されました。 SQL 処理中に、そのコマンドが返されました。SQL0104N "BEGIN-OF-STATEMENT" に続いて予期しないトークン"declare v1 varchar"が見つかりました。予期されたトークンに "<values>"が含まれている可能性があります。 LINE NUMBER=2. SQLSTATE=42601

C:¥work>db2 -tvf plsqltest2.sql!db2set |findstr DB2_COMPATIBILITY_VECTORDB2_COMPATIBILITY_VECTOR=800DB2_COMPATIBILITY_VECTOR=800DB2_COMPATIBILITY_VECTOR=800DB2_COMPATIBILITY_VECTOR=800

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

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

declarev1 varchar(100) := 'PL/SQL Test';

begindbms_output.put_line(v1);

end;

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

PL/SQL Test

DB2_COMPATIBILITY_VECTOR=800をををを設定設定設定設定

DB2_COMPATIBILITY_VECTOR=800設定設定設定設定ありありありあり

DB2_COMPATIBILITY_VECTOR=800設定設定設定設定なしなしなしなし

C:¥>db2set DB2_COMPATIBILITY_VECTOR=800

C:¥>db2stop force2009-05-12 12:37:25 0 0 SQL1064N DB2STOP の処理が正常に終了しました。SQL1064N DB2STOP の処理が正常に終了しました。

C:¥>db2start2009-05-12 12:37:31 0 0 SQL1063N DB2START の処理が正常に終了しました。SQL1063N DB2START の処理が正常に終了しました。

PL/SQLブロックブロックブロックブロックがががが正常正常正常正常にににに処理処理処理処理されるされるされるされる

PL/SQLブロックブロックブロックブロックのののの処理処理処理処理にににに失敗失敗失敗失敗