モジュールの構成
• 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生成例
続き