• 検索結果がありません。

モジュールの構成

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

• 仕様部

• オブジェクトの呼び出し方法の記述

グローバル変数やユーザー定義タイプ(配列、連想配列、カーソルタイプ・・・)の宣言も行う

• 本体

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

CREATE MODULE moo@

ALTER MODULE moo PUBLISH PROCEDURE prot

(IN a INT, IN b BIGINT, IN c VARCHAR(20))

モジュールのメリット

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

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

• 名前衝突の回避

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

• 情報の隠蔽

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

• 権限のコントロール

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

モジュールと PL/SQL

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

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

C:¥work>db2 -tvf modtest.sql set sqlcompat db2

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

create module mod1

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

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

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

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

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

alter module mod1 add procedure print begin call dbms_output.put_line(var1); end

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

alter module mod1 add procedure plus(in p1 int default 1) begin set var1

= var1 + p1; end

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

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

CC:¥work>db2 -tvf pkgtest.sql set sqlcompat plsql

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

create or replace package pkg1 is var1 int :=0;

procedure print;

procedure plus(p1 in int);

function get return int;

end;

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

create or replace package body pkg1 is procedure print is

begin

dbms_output.put_line(var1);

end;

procedure plus(p1 in varchar2 default 1) is begin

var1 := var1 + p1;

end;

function get return int is begin

return var1;

end;

end;

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

SQL PLでモジュールを作成

CREATE MODULE

文で

Module

を作成後、

ALTER MODULE

文で仕様部、本体を追加する

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

CREATE PACKAGE

文、

CREATE PACKAGE BODY文を使用して作成

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

本体 本体 本体 本体

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

本体 本体

本体 本体

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

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 M

PKG1 PL/SQL P

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

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

OBJECTMODULENAME OBJECTNAME OBJECTTYPE PUBLISHED --- -- - ---MOD1 VAR1 VARIABLE Y

MOD1 PLUS PROCEDURE Y MOD1 GET FUNCTION Y MOD1 PRINT PROCEDURE Y PKG1 VAR1 VARIABLE Y PKG1 GET FUNCTION Y PKG1 PRINT PROCEDURE Y PKG1 PLUS PROCEDURE Y

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

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

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

参照例

モジュールへの 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生成例

続き

モジュール制限事項

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

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

• SQL プロシージャー

• SQL 関数

外部プロシージャー

外部関数

作成済み条件

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

ユーザー定義のデータ・タイプ定義

(特殊タイプ、配列タイプ、連想配列タイプ、行タイプ、およびカーソル・タイプ

が含まれます

)

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

モジュールの初期化に使用する

SYS_INIT 初期化プロシージャーは、パラメーターを参照したり、結果セットを戻した

りすることはできません。

• Data Studio

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

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

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

まとめ

• Oracle 互換機能強化概要

• DB2_COMPATIBILITY_VECTOR

• データタイプの互換性

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

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

• PL/SQL サポート

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

ブランク ブランク ブランク

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

参考資料 参考資料

参考資料内容

Weak Typing

Public Synonym

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

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

• ROWNUM

• 外部結合演算子 (+)

• 階層照会

• NUMBER データ・タイプ

• VARCHAR2 データ・タイプ

• DATE データ・タイプ

• TRUNCATE TABLE

• 文字リテラル

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

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

• PL/SQL のコンパイル

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

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

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

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

• 割当て

SET salary := ‘52000’

• 比較

WHERE salary > ‘52000’

• ビルトイン関数での利用

‘salary: ‘ || 52000 (文字列連結の例)

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

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

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

Weak Typing

暗黙的な変換の例

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

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

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

関連したドキュメント