...

Macro PSM <第1.00版>2001年6月 お断り:当資料は、DB2 UDB V7.2(UNIX,PC) をベースに作成されています。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部

by user

on
Category: Documents
8

views

Report

Comments

Transcript

Macro PSM <第1.00版>2001年6月 お断り:当資料は、DB2 UDB V7.2(UNIX,PC) をベースに作成されています。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部
DB2 UDB(PC&UNIX) V7.2
Macro PSM
Macro PSM
お断り:当資料は、DB2 UDB V7.2(UNIX,PC) をベースに作成されています。
<第1.00版>2001年6月
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
1
DB2 UDB(PC&UNIX) V7.2
Macro PSM
Macro PSM (内容)
Macro PSMとは
Macro PSMの意義
Dynamic Compound ステートメント
DECLAREローカル変数
DECLARE Conditions
SETステートメント
IFステートメント
WHILEステートメント
FORステートメント
LEAVE/ITERATEステートメント
GET DIAGNOSTICSステートメント
SIGNALステートメント
DB2LOOKでの抽出
Macro PSMでの制約
今後の動向
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
Macro
PSM?
2
DB2 UDB(PC&UNIX) V7.2
Macro PSM
Macro PSMとは
下記のコマンドまたは環境からSQLプロシージャー言語が使用可能
CREATE TRIGGER
CREATE FUNCTION
SQL Statement
拡張されたコントロールロジックは、トリガー、SQL機能、対話式SQLにて使用可能です。
トリガー
トリガー本体におけるロジックに使用可能
サイベースやオラクルの移植を簡易化
SQL関数(スカラー、テーブル、列)
SQLスカラー関数は競合するDBMSの特定の関数から、DB2へ道を示す簡単な方法を提供
定型へのSQL変換機能の強化
SQLステートメント
ATOMIC複合ステートメントがSQLステートメントとして使用可能
組み込みSQLからの制御フローステートメント使用可能
SQLを使ったシンプルなプロシージャーを記述
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
3
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
動的複合ステートメント(Macro PSM)
Macro SQLプロージャーとは
動的複合ステートメントは、他の SQL ステートメントを 1 つの実行可能なブロックに グループ化したものです。
動的複合ステートメントでは、SQL 変数の宣言、SQLSTATE に関連する条件の宣言、 および 1 つ以上の SQL 手続き
ステートメントの指定が可能です。 動的複合ステートメントでエラーが発生した場合、 前の SQLステートメントはすべて
ロールバックされ、 動的複合ステートメントの残りの SQLステートメントは処理されません。
Macro SQLプロージャーの使用可能環境
動的複合ステートメントはトリガー、SQL 関数、または SQL メソッドに組み込むことができ、 また、動的 SQL ステートメント
を使用して実行することができます。この実行可能ステートメントは、動的に準備することができます。 ステートメントを呼
び出す特権は必要ありませんが、 そのステートメントに関連する許可 ID は複合ステートメント内の組み込み SQL ステート
メントを 呼び出すために必要な特権を持っていなければなりません。
変数定義とその用途
変数は変数宣言のサブステートメントにあります。 条件は、条件宣言の SQLSTATE値に基づくサブステートメントにあり
ます。 動的複合ステートメントは DB2 によって単一ステートメントとしてコンパイルされます。 このステートメントは、制御
フロー・ロジックをほとんど含まない、有効なデータ・フローを 含む短いスクリプトに対して効果的に使用することができます
。 ネストした複雑な制御フローを持つ大きな構成の場合、SQL プロシージャーの 使用を検討してください。
使用可能なLogic制御ステートメント
動的複合ステートメント内では、複数の制御フロー・ロジック・ステートメントを使用できます。 このステートメントには、
FOR ステートメント、IF ステートメント、ITERATE ステートメント、 および WHILE ステートメントがあります。 これらのス
テートメント、および、サポートされているこれ以外のステートメントの詳細については、 SQL 解説書 を参照してください。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
4
DB2 UDB(PC&UNIX) V7.2
Macro PSM
Macro PSMの意義
Macro PSMの意義
現存のSQL UDFおよびトリガーの拡張
Cコンパイラーが不要
SQLストアードプロシージャーのSubset
Dynamic Compund (Begin Atomic..... END)
SQL-procedure-statement
以下の SQL-control-statements は、動的複合ステートメント(Dynamic Compound)の内部
で使用できます。
o FOR ステートメント
o GET DIAGNOSTICS ステートメント
o IF ステートメント
o ITERATE ステートメント
o LEAVE ステートメント
o SIGNAL ステートメント
o WHILE ステートメント
SETステートメント
DECLAREローカル変数
DECLARE Conditions
GET DIAGNOTICS
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
5
DB2 UDB(PC&UNIX) V7.2
Macro PSM
ブランク・ページです
6
DB2 UDB(PC&UNIX) V7.2
Dynamic Compound ステートメント
Dynamic Compound ステートメント
構文
dynamic-compound-statement
>>-+--------------+--BEGIN ATOMIC------------------------------->
|
(1)
|
'-label:-------'
>-----+-----------------------------------------------+--------->
| .-----------------------------------------. |
| V
| |
'-----+-| SQL-variable-declaration |-+---;---+--'
'-| condition-declaration |----'
.-,-----------------------------.
V
|
>--------SQL-procedure-statement--;---+---END--+--------+------><
'-label--'
SQL-variable-declaration
.-,--------------------.
V
|
|---DECLARE-------SQL-variable-name---+--data-type-------------->
.-DEFAULT NULL-------------.
>-----+--------------------------+------------------------------|
'-DEFAULT--default-values--'
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
7
Macro PSM
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
Dymaic Compund Statement
複合ステートメント (動的)
複合ステートメントは、別のステートメントを実行可能ブロックにグループ化します。 動的準備済みアトミック複合ステートメ
ントの内部で SQL 変数を宣言することができます
呼び出し
このステートメントはトリガー、SQL 関数、または SQL メソッドに組み込むことができ、 また動的 SQL ステートメントの使
用によって出すことができます。 動的に準備できる実行可能ステートメントです。
権限
動的複合ステートメントを呼び出すために、特権は必要ありません。 ただし、複合ステートメントの許可 ID に、複合ステー
トメントに組み込まれている SQL ステートメントを 呼び出すために必要な特権がなければなりません。
注意点
* 動的複合ステートメントは、DB2 によって単一ステートメントとしてコンパイ
ルされます。 このステートメントは、小さ
な制御フロー・ロジックを含む短 いスクリプトに有効ですが、 大きな意味を持つデータ・フローには有効では ありません。
複雑な制御フローがネストされている大きな構成の場合、SQLプロシージャーの使用を お勧めします。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
8
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
Dynamic Compound ステートメント例
connect to v7db%
update command options using c off%
create table t1 (col1 int,col2 int,col3 int)%
begin atomic
declare c1 int default 0;
declare c2 int default 0;
declare c3 int default 0;
while ((select count(*) from t1) < 10) do
set c1 = c1 + 1, c2 = c2 + 10, c3 = c3 + 100;
insert into t1 values(c1, c2, c3);
end while;
end%
select * from t1%
rollback%
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
9
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
実行例
create table t1 (col1 int,col2 int,col3 int)
DB20000I The SQL command completed successfully.
begin atomic
declare c1 int default 0;
declare c2 int default 0;
declare c3 int default 0;
while ((select count(*) from t1) < 10) do
set c1 = c1 + 1, c2 = c2 + 10, c3 = c3 + 100;
insert into t1 values(c1, c2, c3);
end while;
end
DB20000I The SQL command completed successfully.
select * from t1
COL1
COL2
COL3
----------- ----------- ----------1
10
100
2
20
200
3
30
300
4
40
400
5
50
500
6
60
600
7
70
700
8
80
800
9
90
900
10
100
1000
10 record(s) selected.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
10
DB2 UDB(PC&UNIX) V7.2
Macro PSM
DECLAREローカル変数
DECLAREローカル変数
変数名は64文字までサポートされる
サポートされるデータタイプ
すべてのFor BIT Data,BIGINT,LOBを含むデータタイプ
Structred Type, UDT, Reference Typeもサポートされる
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
11
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
DECLAREローカル変数
SQL-variable-declaration
動的複合ステートメントに対してローカルである変数を宣言します。
SQL-variable-name
ローカル変数の名前を定義します。 DB2 は SQL 変数をすべて大文字に変換します。 以下のような名前にすることはで
きません。
+ 同じ複合ステートメント内の別の SQL 変数と同じ名前
+ パラメーター名と同じ名前
+ 列名と同じ名前
SQL 変数と同じ名前の ID、および列参照が SQL ステートメントに組み込まれている場合、
DB2 はその ID を列として解釈します。
data-type
変数のデータ・タイプを指定します。
DEFAULT default-values または NULL
SQL 変数のデフォルトを定義します。 動的複合ステートメントが呼び出されると、この変数は初期化されます。 デフォルト
値が指定されていない場合、変数は NULL に初期化されます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
12
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
実行例
create function foo(In int) returns integer
begin atomic
declare a int;
return a + in ;
end
DB20000I The SQL command completed successfully.
values foo(1)
1
----------1 record(s) selected.
-- Reference type
create type person2 as (name varchar(10)) ref using integer mode db2sql
DB20000I The SQL command completed successfully.
create function foo(in ref(person2)) returns ref(person2)
begin atomic
declare a,b ref(person2);
return person2( integer(a) + integer(b)+ integer(in) );
end
DB20000I The SQL command completed successfully.
values foo(person2(1))
1
----------1 record(s) selected.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
13
DB2 UDB(PC&UNIX) V7.2
Macro PSM
ブランク・ページです
14
DB2 UDB(PC&UNIX) V7.2
Macro PSM
DECLARE Conditions
DECLARE Conditions
構文
condition-declaration
|---DECLARE--condition-name--CONDITION--FOR--------------------->
.-VALUE-.
.-SQLSTATE--+-------+---.
>----+-----------------------+---string-constant----------------|
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
15
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
DECLARE Conditions
condition-declaration
条件名および対応する SQLSTATE 値を宣言します。
condition-name
条件の名前を指定します。条件名はプロシージャー本体内で固有でなければならず、
宣言された複合ステートメント内でのみ参照が可能です。
FOR SQLSTATE string-constant
条件に関連する SQLSTATE を指定します。 string-constant は引用符で囲んだ 5 文字で指定しなければなりませんが、
'00000' にすることはできません。
実行例)
begin atomic
declare no_table condition for sqlstate '72704';
signal no_table
SET message_text='Table does not exist';
end
SQL0438N Application raised error with diagnostic text: "Table does not exist". SQLSTATE=72704
SIGNAL ステートメントは、エラーまたは警告条件を通知するのに使用します。 これを使用すると、指定したSQLSTATE
と任意選択のメッセージ・テキストが、 エラーまたは警告とともに戻されます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
16
DB2 UDB(PC&UNIX) V7.2
Macro PSM
SETステートメント
SETステートメント
構文
>>-SET---------------------------------------------------------->
.-,----------------------------------------------------------------------------.
V
|
>--------+-| target-variable |--=--+-式------+------------------------------------+--+>
|
+-NULL----+
|
|
'-DEFAULT-'
|
|
.-,----------------------.
.-,------------.
|
|
V
|
V
(1)
|
|
'-(-----| target-variable |---+---)--=--(--+----+-式------+--+----+---)--'
|
+-NULL----+
|
|
'-DEFAULT-'
|
|
(2) |
'-row-fullselect-------'
>--------------------------------------------------------------><
target-variable
|---+-SQL-variable-name--------+---+--------------------------+-|
'-transition-variable-name-' | .--------------------. |
| V
| |
'----..attribute-name---+--'
注:
1. 式の数、NULL および DEFAULT は target-variable の 数に一致していなけれ
ばなりません。
2. 選択リストの列の数は、target-variable の数に一致していなければなりませ
ん。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
17
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
SETステートメント
target-variable
割り当てのターゲット変数を識別します。 同じ変数を表す target-variableを複数指定することはできません
(SQLSTATE 42701)。
SQL-variable-name
割り当てターゲットである SQL 変数を識別します。 SQL 変数は、使用する前に宣言しておかなければなりません。
SQL 変数を動的複合ステートメントに定義することができます。
transition-variable-name
変換行で更新する列を識別します。 transition-variable-name は、新しい値を識別する相関名によってオプションで
修飾されている、 トリガーのサブジェクト表にある列を識別していなければなりません(SQLSTATE 42703)。
..attribute name
設定されている構造化タイプの属性 (属性割り当て ) を指定します。
指定する SQL-variable-nameor transition-variable-name は、 ユーザー定義の構造化タイプで定義されていなければな
りません (SQLSTATE 428DP)。 attribute-name は、構造化タイプの属性でなければなりません。
..attribute name 文節を必要としない割り当ては、 従来型割り当てと呼ばれます。
expression
target-variable の新しい値を指示します。 expression は、SQL 解説書の第 2 章で説明されている、どのタイプの式でも構い
ません。 スカラーfullselect で使用される場合を除き、列関数を組み込むことはできません (SQLSTATE 42903)。
CREATE TRIGGER ステートメントのコンテキストにおいて、 expression は OLD および NEW 変換変数への参照を含むことが
でき、変換変数を指定するためには correlation-name で修飾されていなければ なりません (SQLSTATE 42702)。
NULL
NULL 値を指定します。NULL 可能列にのみ指定することができます (SQLSTATE 23502)。 属性のデータ・タイプに特定し
て cast されていないかぎり、NULLを属性割り当ての 値にすることはできません (SQLSTATE 429B9)。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
18
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
SETステートメント
DEFAULT
デフォルト値が使用されることを指定します。
target-variable が列であれば、挿入される値は、どのように列が 表に定義 されているかによって異なります。
o 列が WITH DEFAULT 文節で定義されている場合、値は、その列に定義されたデフォルトに 設定されます。
o 列が IDENTITY 文節で定義されている場合、値はデータベース・マネージャーによって生成されます。
o 列が WITH DEFAULT 文節、IDENTITY 文節、または NOT NULL 文節の指定なしで定義されている場合、
値は NULL になります。
o 列が NOT NULL 文節で定義されていて IDENTITY 文節が使用されていないか、 あるいは WITH DEFAULT文節が
使用されていないか、DEFAULT NULL が使用されている場合、 DEFAULT キーワードをその列に指定することはで
きません (SQLSTATE 23502)。
target-variable が SQL 変数であれば、挿入される値は、 変数宣言に指定または暗黙指定されているデフォルトになり
ます。
row-fullselect
割り当てに指定されている target-variables の数に対応する列数とともに、単一行を返す fullselect です。 値は、対応する
target-variable それぞれに割り当てられます。 row-fullselect の結果が行なしであれば、NULL 値が割り当てられます。
CREATE TRIGGER ステートメントのコンテキストにおいて、 row-fullselect は、使用する変換変数を指定する ために
correlation-name で修飾されていなければならない、 OLD および NEW 変換変数への参照を含むことができます
(SQLSTATE 42702)。 結果に行が複数ある場合、エラーが返されます (SQLSTATE 21000)。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
19
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
SETステートメント
規則
* 式から割り当てる値の数 NULL および DEFAULT、または row-fullselect は、割当てに指定されている target-variable
の数に一致していなければなりません (SQLSTATE 42802)。
* SET 変数ステートメントは、1 つのステートメントに SQL 変数と変換変数を割り当てることができません (SQLSTATE
42997)。
* SQL 解説書の第 2 章で説明されている割り当て規則に基づいて、値はtarget-variable に 割り当てられてます。
ステートメントが BEFORE UPDATE トリガーで使用され、 レジストリー変数がDB2_UPDATE_PART_KEY=OFF であれば、
target-variable として 指定されている transition-variable を区分化キー列にすることは できません (SQLSTATE
42997)。
* 複数の割り当てが組み込まれている場合、すべての expression および
row-fullselect は、割り当てが実行される前
に 評価されます。 そのため、expression または row fullselect での target-variables への参照は常に、 単一 SET ス
テートメントでの割り当ての前に、target-variable の値となります。
* 特殊タイプとして定義されている識別列が更新されると、計算全体がソース・タイプで 行われ、その列に値が実際に割り
当てられる前に、結果は特殊タイプに cast されます。
* 識別列について、DB2 に SET ステートメントの値を生成させるには、次のように DEFAULT キーワードを 使用してくださ
い。
SET NEW.EMPNO = DEFAULT
この例では、NEW.EMPNO が識別列として定義され、この列を更新するために使
用される 値が DB2 によって生成されます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
20
DB2 UDB(PC&UNIX) V7.2
Macro PSM
IFステートメント
IFステートメント
IF ステートメントは、条件の評価に基づいて実行パスを選択します。
構文
>>-IF--search-condition--THEN----------------------------------->
.-------------------------------.
V
|
>--------SQL-procedure-statement--;---+------------------------->
.--------------------------------------------------------------------------.
V
|
>--------+--------------------------------------------------------------------+--+>
|
.-------------------------------. |
|
V
| |
'-ELSEIF--search-condition--THEN-----SQL-procedure-statement--;---+--'
>-----+------------------------------------------+--END IF-----><
|
.-------------------------------. |
|
V
| |
'-ELSE-----SQL-procedure-statement--;---+--'
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
21
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
IF ステートメント
search-condition
SQL ステートメントを呼び出す条件を指定します。 条件が不定または偽の場合、条件が真になるか、または処理がELSE
文節に到達するまで、 処理は次の検索条件に継続されます。
SQL-procedure-statement
前の search-condition が真の場合に呼び出されるステートメントを指定します。 真と評価されるsearch-condition
がない場合、 ELSE キーワードの後に続く SQL-procedure-statement が呼び出されます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
22
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
IFステートメント
------------------------------------------------------------ Test different number of legs in the IF statement
-- Create a function containing an IF statement block where
-- different function argument result in different legs being chosen
----------------------------------------------------------CREATE FUNCTION foo (n1 INT)
RETURNS INT
BEGIN ATOMIC
DECLARE result INT default 0;
SET result = n1;
IF (n1 > 20) THEN
SET result = result * 10;
ELSEIF (n1 > 10) THEN
SET result = result * 2;
END IF;
RETURN result;
END
DB20000I The SQL command completed successfully.
values foo(1)
1
----------1
1 record(s) selected.
values foo(11)
1
----------22
1 record(s) selected.
values foo(100)
1
----------1000
1 record(s) selected.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
23
DB2 UDB(PC&UNIX) V7.2
Macro PSM
ブランク・ページです
24
DB2 UDB(PC&UNIX) V7.2
Macro PSM
WHILEステートメント
WHILEステートメント
WHILE ステートメントは、指定した条件が真である間、 ステートメント、またはステートメントの
グループの実行を繰り返します。
構文
>>-+----+--WHILE--search-condition--DO-------------------------->
'-:label--'
.-------------------------------.
V
|
>--------SQL-procedure-statement--;---+--END WHILE-------------->
>-----+--------+-----------------------------------------------><
'-label--'
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
25
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
WHILEステートメント
search-condition
SQL ステートメントを呼び出す条件を指定します。 条件が不定または偽の場合、条件が真になるか、または処理がELSE
文節に到達するまで、 処理は次の検索条件に継続されます。
SQL-procedure-statement
前の search-condition が真の場合に呼び出されるステートメントを指定します。 真と評価されるsearch-condition がない場合、
ELSE キーワードの後に続く SQL-procedure-statement が呼び出されます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
26
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
WHILEステートメント
---Test different number of statements within While loop. Create a function containing a while loop where
-- different function arguments result in different numberof passes through the loop
----------------------------------------------------------CREATE FUNCTION foo (n1 INT)
RETURNS INT
BEGIN ATOMIC
DECLARE count INT;
DECLARE while_count INT default 0;
SET count = n1;
WHILE (count < 10) DO
SET count = count
+ 1;
SET while_count = while_count
+ 1;
END WHILE;
RETURN while_count;
END
DB20000I The SQL command completed successfully.
-- This goes through While loop --------------------------values foo(1)
1
----------9
1 record(s) selected.
-- This goes through While loop once----------------------values foo(9)
1
----------1
1 record(s) selected.
-- This never go through While loop ----------------------values foo(100)
1
----------0
1 record(s) selected.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
27
DB2 UDB(PC&UNIX) V7.2
Macro PSM
ブランク・ページです
28
DB2 UDB(PC&UNIX) V7.2
Macro PSM
FORステートメント
FORステートメント
FOR ステートメントは、表の行ごとに、ステートメントまたはステートメントのグループを実行し
ます。
構文
>>-+---------+---FOR--for-loop-name--AS------------------------->
'-label:--'
>-----+--------------------------+--select-statement---DO------->
'-cursor-name--CURSOR FOR--'
.-------------------------------.
V
|
>--------SQL-procedure-statement--;---+--END FOR----+--------+-><
'-label--'
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
29
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
FORステートメント
label
FOR ステートメントのラベルを指定します。 開始ラベルを指定した場合、 そのラベルを LEAVE および ITERATE
ステートメントで使用することができます。 終了ラベルを指定する場合、開始ラベルと同じにしなければなりませ
ん。
for-loop-name
生成された暗黙的な複合ステートメントのラベルを指定し、FOR ステートメントを実装します。 これは、複合ステー
トメントのラベルに関する規則に従いますが、 FOR ステートメント内では ITERATE または LEAVE ステートメント
を併用できないという点は除きます。 for-loop-name は、 指定した select-statement から戻される列名を修飾
するのに使用します。
cursor-name
SELECT ステートメントで生成される結果表から行を選択するのに使用するカーソルに、 名前を指定します。 指定
されていない場合、DB2 が固有のカーソル名を生成します。
select-statement
カーソルの SELECT ステートメントを指定します。 選択リスト内のすべての列に名前を付けなければなりません。
また、複数の列に同じ名前を付けることはできません。
SQL-procedure-statement
表の行ごとに呼び出すステートメント (複数も可) を指定します。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
30
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
FORステートメント
-- Test: Try a single statement
insert into scratch values (1, 'data')
DB20000I The SQL command completed successfully.
create function foo161b() returns varchar(20)
begin atomic
declare data varchar(20) default '';
l: for row as
select text from scratch
do
set data = text ;
end for l;
return data;
end
DB20000I The SQL command completed successfully.
values foo161b()
1
-------------------data
1 record(s) selected.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
31
DB2 UDB(PC&UNIX) V7.2
Macro PSM
ブランク・ページです
32
DB2 UDB(PC&UNIX) V7.2
LEAVE/ITERATEステートメント
Macro PSM
LEAVEステートメント
LEAVE ステートメントは、プログラム制御をループまたは複合ステートメントの外側に移動さ
せます。
ITERATEステートメント
ITERATE ステートメントを使用すると、制御のフローがラベル付きループの最初に戻ります。
構文
>>-LEAVE--label------------------------------------------------><
構文
>>-ITERATE--label----------------------------------------------><
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
33
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
LEAVEステートメント
label
終了する複合、FORまたは WHILE ステートメントのラベルを指定します。
規則
LEAVE ステートメントが複合ステートメントの外側に制御を移動すると、 その複合ステートメント内のすべてのオープン・カーソ
ル (結果セットを戻すのに使用されているカーソルを除く) がクローズされます。
ITERATEステートメント
label
DB2 が制御のフローを渡す先の FORまたは WHILE ステートメントのラベルを指定します。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
34
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
LEAVEステートメント
------------------------------------------------------------ 1.10.2
-- Test nested LEAVE
-- Run a compound statement with nested loop statement
-- and a leave in the deepest nesting level
---------------------------------------------------------------------------------------------------------------------- Compound: nested WHILE loop and LEAVE to level2
----------------------------------------------------------BEGIN ATOMIC
DECLARE result INT default 0;
DECLARE count1 INT default 2;
DECLARE count2 INT default 2;
level1: WHILE (count1 > 0) DO
SET count1 = count1 - 1;
level2: WHILE (count2 > 0) DO
SET result = result + 1;
SET count2 = count2 - 1;
leave level2;
END WHILE level2;
END WHILE level1;
INSERT INTO scratch values (0,char(result));
END
DB20000I The SQL command completed successfully.
select * from scratch
PK
TEXT
----------- -------------------------------------------------0 2
1 record(s) selected.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
35
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
ITERATEステートメント
------------------------------------------------------------ a nested while with ITERATE, go to level2
----------------------------------------------------------BEGIN ATOMIC
DECLARE result INT default 0;
DECLARE count1 INT default 2;
DECLARE count2 INT default 2;
level1: WHILE (count1 > 0) DO
SET count1 = count1 - 1;
level2: WHILE (count2 > 0) DO
SET result = result + 1,
count2 = count2 - 1;
iterate level2;
END WHILE level2;
END WHILE level1;
INSERT INTO scratch values (0,char(result));
END
DB20000I
The SQL command completed successfully.
select * from scratch
PK
TEXT
---------- -----------------------------0 2
1 record(s) selected.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
36
DB2 UDB(PC&UNIX) V7.2
GET DIAGNOSTICSステートメント
Macro PSM
GET DIAGNOSTICSステートメント
GET DIAGNOSTICS ステートメントは、直前に呼び出された SQL ステートメントに関する情報
を入手します。
構文
>>-GET DIAGNOSTICS--SQL-variable-name--=----+-ROW_COUNT-----+--><
'-RETURN_STATUS-'
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
37
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
GET DIAGNOSTICSステートメント
SQL-variable-name
割り当てのターゲットとなる変数を識別します。 この変数は整変数でなければなりません。 SQL変数は複合ステートメント
で定義できます。
ROW_COUNT
直前に呼びされた SQL ステートメントに関連する行数を識別します。 直前の SQL ステートメントが DELETE、INSERT、ま
たは UPDATE ステートメントの場合、 ROW_COUNT はそのステートメントによって、 それぞれ削除、挿入、または更新さ
れた行数を戻します。 その際に、トリガーまたは参照保全制約によって影響を受ける行は除外されます。 直前のステート
メントが PREPAREステートメントの場合、ROW_COUNT は、 準備済みステートメントの結果行の見積もり数を識別します。
RETURN_STATUS
直前に実行された SQL ステートメントが、 状況を戻すプロシージャーを呼び出す CALL ステートメントの場合に、 そのス
テートメントに関連するストアード・プロシージャーから戻される状況値を識別します。 直前のステートメントがそのようなス
テートメントでなければ、 戻される値は特に意味のない、何らかの整数です。
(MACRO PSMではCALLステートメント自身をサポートしていない為、使用できません
規則
GET DIAGNOSTICS ステートメントは、診断域の内容の変更は行いません (SQLCA)。 SQLSTATEまたは SQLCODE 特
殊変数が SQL プロシージャーで宣言されている場合、 GET DIAGNOSTICS ステートメントの発行によって戻される
SQLSTATE または SQLCODE に設定されます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
38
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
GET DIAGNOSTICSステートメント
create table t1(c1 int, c2 integer, c3 integer)
DB20000I The SQL command completed successfully.
insert into t1 values(1, 1, 1), (2, 2, 2), (3, 3, 3)
DB20000I The SQL command completed successfully.
------------------------------------------------------------ 1.9.1
-- Ensure DIAGNOSTICS behavior in "bad" places
-- Run a compound statement with GET DIAGNOSTICS in it at
-- various places
---------------------------------------------------------------------------------------------------------------------- Put GET DIAGNOSTICS first statement in a FOR
------------------------------------------------------------ it should run sccessful, but it returns -901 not unique
begin atomic
declare a int default 0;
declare b int default 0;
l: for row as
select c1 from t1
do
get diagnostics b = row_count;
set a=a + 1;
end for l;
insert into scratch values (b ,'T1 contains '||char(a)||' rows');
end
DB20000I
The SQL command completed successfully.
select * from scratch
PK
TEXT
----------- -----------------------------0 T1 contains 3
rows
1 record(s) selected.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
39
DB2 UDB(PC&UNIX) V7.2
Macro PSM
ブランク・ページです
40
DB2 UDB(PC&UNIX) V7.2
Macro PSM
SIGNALステートメント
SIGNALステートメント
SIGNAL ステートメントは、エラーまたは警告条件を通知するのに使用します。 これを使用す
ると、指定した SQLSTATE と任意選択のメッセージ・テキストが、 エラーまたは警告とともに
戻されます。
構文
.-VALUE-.
>>-SIGNAL----+-SQLSTATE--+-------+--sqlstate-string-constant--+->
'-condition-name---------------------------------'
>-----+---------------------------------------------------------+-><
'-SET--MESSAGE_TEXT-- = --+-variable-name--------------+--'
'-diagnostic-string-constant-'
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
41
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
SIGNALステートメント
SQLSTATE VALUE sqlstate-string-constant
ここで指定したストリング定数は SQLSTATE を表します。 この定数は、正確に 5 文字の文字ストリング定数でなければ
ならず、 SQLSTATE の規則に従っていなければなりません。 各文字は、数字 ('0'~'9')、 またはアクセントのない大文字
の英字 ('A'~'Z') でなければなりません。 SQLSTATE クラス (最初の 2 文字) は、 '00' であってはなりません (これは正
常終了
を表すため)。 SQLSTATE がこれらの規則に従っていない場合には、エラーになります (SQLSTATE
428B3)。
condition-name
条件の名前を指定します。 条件名はプロシージャー内で固有でなければならず、参照できるのは、 その条件名が宣言さ
れている複合ステートメントの中だけです。
SET MESSAGE_TEXT=
エラーまたは警告を記述するストリングを指定します。 このストリングは SQLCA の SQLERRMCフィールドに戻されます。
実際のストリングが 70 バイトを超える場合、警告が出されずに切り捨てられます。 この文節を指定する場合、
SQLSTATE または condition-name も指定しなければなりません (SQLSTATE 42601)。
variable-name
複合ステートメント内で宣言しなければならない SQL 変数を識別します。 この SQL 変数は、CHAR または VARCHAR
データ・タイプとして定義しなければなりません。
diagnostic-string-constant
メッセージ・テキストを含んでいる文字ストリング定数を指定します。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
42
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
SIGNALステートメント
-----
Test SIGNAL with SQLSTATE
Create a function containing SIGNAL statement with a
SQLSTATE and run it
Signal a message text string
----------------
create function foo172a() returns int
begin atomic
declare a int default 1;
signal SQLSTATE '72704' set message_text='Hello';
return a;
end
DB20000I The SQL command completed successfully.
values foo172a()
1
----------SQL0438N Application raised error with diagnostic text: "Hello".
SQLSTATE=72704
-- Signal a message text variable
---------------create function foo172b() returns int
begin atomic
declare a int default 1;
declare msg varchar(80);
set msg = 'Hello, This is a variable test case' ;
signal SQLSTATE '72704' set message_text=msg;
return a;
end
DB20000I The SQL command completed successfully.
values foo172b()
1
----------SQL0438N Application raised error with diagnostic text: "Hello, This is a
variable test case". SQLSTATE=72704
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
43
DB2 UDB(PC&UNIX) V7.2
Macro PSM
ブランク・ページです
44
DB2 UDB(PC&UNIX) V7.2
Macro PSM
DB2LOOKでの抽出
DB2LOOKでの抽出
-tdオプション
db2look Version 7.1
Syntax: db2look -d DBname [-u Creator] [-z Schema] [-s] [-g] [-a] [-t Tname1 Tname2...TnameN]
[-p] [-o Fname] [-i userID] [-w password]
db2look -d DBname [-u Creator] [-z Schema] [-a] [-e] [-td x] [-t Tname1 Tname2...TnameN]
[-m] [-c] [-r] [-x] [-l] [-f] [-o Fname] [-i userID] [-w password]
-d: Database Name: This must be specified
-a: Generate statistics for all creators
-c: Do not generate COMMIT statements for mimic
-e: Extract DDL file needed to duplicate database
-g: Use graph to show page fetch pairs for indices
-h: More detailed help message
-m: Run the db2look utility in mimic mode
-o: Redirects the output to the given file name
-p: Use plain text format
-r: Do not generate RUNSTATS statements for mimic
-s: Generate a postscript file
-t: Generate statistics for the specified tables
-td: Delimiter given for -td option must be one character only
-x: Generate Authorization statements DDL
-l: Generate Database Layout: Nodegroups, Bufferpools and Tablespaces
-f: Extract configuration parameters and environment variables
-u: Creator ID: If -u and -a are both not specified then $USER will be used
-z: Schema name: If -z and -a are both specified then -z will be ignored
-i: User ID to log on to the server where the database resides
-w: Password to log on to the server where the database resides
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
45
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
db2lookの使用例
UPDATE COMMAND OPTIONS USING c ON
DB20000I The UPDATE COMMAND OPTIONS command completed successfully.
------------------------------------------------------------ 3.9.1 Create a function, a method and a trigger
-- containing multiple SQL statements each
-- /* C-style comments */ and -- SQL comments.
-- Run db2look on the database. Drop the objects and
-- recreate them from the db2look script
---------------------------------------------------------------------------------------------------------------------- Create a table
----------------------------------------------------------create table aztest (c1 smallint not null,c2 smallint,c3 char(20))
DB20000I The SQL command completed successfully.
insert into aztest values (1,1,'This is row1')
DB20000I The SQL command completed successfully.
------------------------------------------------------------ Create function
----------------------------------------------------------create function foo391() returns smallint
begin atomic
declare a smallint;
/* This is a comment */
set a = 100;
return a;
end
DB20000I The SQL command completed successfully.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
46
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
db2lookの使用例
------------------------------------------------------------ Create Trigger
----------------------------------------------------------CREATE TRIGGER trg1
NO CASCADE BEFORE INSERT ON aztest
REFERENCING NEW AS new
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
/* This is a comment */
declare msg varchar(80);
set msg = 'DB2LOOK Test!!';
signal SQLSTATE '75001' set message_text=msg ;
END
DB20000I The SQL command completed successfully.
------------------------------------------------------------ Run db2look without -td option
----------------------------------------------------------!db2look -d sb -e -o db2look.output1 -u azuma
% Creating DDL for table(s)
% Output is sent to file: db2look.output1
list tables
Table/View
Schema
Type Creation time
------------------------------- --------------- ----- -------------------------AZTEST
AZUMA
T
2001-05-27-10.38.32.310001
1 record(s) selected.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
47
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
db2lookの使用例
------------------------------------------------------------ Run db2look with -td option
----------------------------------------------------------!db2look -d sb -e -o db2look.output2 -u azuma -td %
% Creating DDL for table(s)
% Output is sent to file: db2look.output2
drop function foo391
DB20000I The SQL command completed successfully.
drop trigger trg1
DB20000I The SQL command completed successfully.
drop table aztest
DB20000I The SQL command completed successfully.
------------------------------------------------------------ Re-create table and function using db2look.output2
----------------------------------------------------------!db2 -vtd% -f db2look.output2
CONNECT TO SB
Database Connection Information
Database server
SQL authorization ID
Local database alias
= DB2/NT 7.2.0
= AZUMA
= SB
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
48
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
db2lookの使用例
create function FOO391() returns smallint
begin atomic
declare a smallint;
/* This is a comment */
set a = 100;
return a;
end
DB20000I The SQL command completed successfully.
CREATE TABLE "AZUMA "."AZTEST" ( "C1" SMALLINT NOT NULL , "C2" SMALLINT , "C3
" CHAR(20) ) IN "USERSPACE1"
DB20000I The SQL command completed successfully.
CREATE TRIGGER trg1
NO CASCADE BEFORE INSERT ON aztest
REFERENCING NEW AS new
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
/* This is a comment */
declare msg varchar(80);
set msg = 'DB2LOOK Test!!';
signal SQLSTATE '75001' set message_text=msg ;
END
DB20000I The SQL command completed successfully.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
49
DB2 UDB(PC&UNIX) V7.2
Macro PSM
ブランク・ページです
50
DB2 UDB(PC&UNIX) V7.2
Macro PSM
Macro PSMでの制約
CALL文は使用できない
V8で対応予定
Nicknameの使用はCompound SQLステートメント内のみ
CREATE Function/CREATE Trigger内では使用できない
CREATE FUNCTION内のSQL文で書き込みは不可
SQLステートメントLEVEL ISOLATIONは使用不可
CREATE Triggerでネストレベルは16までの制約に注意
トリガーのカスケード実行時の最大の深さは16まで
WHILE、FOR loopもカウントされる
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
51
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
CREATE Triggerでネストレベルは16までの制約に注意 (OKケース)
create table t1 (i1 int,i2 int,i3 int)
DB20000I The SQL command completed successfully.
create trigger t1_t1 after insert on t1
referencing new as n
for each row mode db2sql
when ( (select count(*) from t1) > 0 )
begin atomic
declare count int default 0;
I1: while ( (select count(*) from t1 ) < 8 ) do
insert into t1(i1,i2,i3) values (n.i1, count, n.i3);
set count = count + 1 ;
end while ;
end
DB20000I The SQL command completed successfully.
insert into t1(i1,i2,i3) values (1, 2, 3)
DB20000I The SQL command completed successfully.
select * from t1
I1
I2
I3
----------- ----------- ----------1
2
3
1
0
3
1
0
3
1
0
3
1
0
3
1
0
3
1
0
3
1
0
3
8 record(s) selected.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
52
DB2 UDB(PC&UNIX) V7.2
Macro PSM
解説:
CREATE Triggerでネストレベルは16までの制約に注意 (ERRORケース)
create table t1 (i1 int,i2 int,i3 int)
DB20000I The SQL command completed successfully.
create trigger t1_t1 after insert on t1
referencing new as n
for each row mode db2sql
when ( (select count(*) from t1) > 0 )
begin atomic
declare count int default 0;
I1: while ( (select count(*) from t1 ) < 9 ) do
insert into t1(i1,i2,i3) values (n.i1, count, n.i3);
set count = count + 1 ;
end while ;
end
DB20000I The SQL command completed successfully.
insert into t1(i1,i2,i3) values (1, 2, 3)
SQL0723N An error occurred in a triggered SQL statement in trigger
"AZUMA.T1_T1". Information returned for the error includes SQLCODE "-724",
SQLSTATE "54038" and message tokens "AZUMA.T1_T1". SQLSTATE=09000
>db2 ? sql0724n
SQL0724N The activation of trigger "<trigger-name>" would exceed the maximum level of cascading.
Explanation: Cascading of triggers occurs when a triggered SQL
statement in a trigger would result in another trigger being
activated or when a referential constraint delete rule causes
additional triggers to be activated. The depth of this cascading
is limited to 16.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
53
DB2 UDB(PC&UNIX) V7.2
Macro PSM
ブランク・ページです
54
DB2 UDB(PC&UNIX) V7.2
Macro PSM
今後の動向
今後の動向
DB2 decides when to inline and when to
go external at usage time
CREATE TRIGGER/ROUTINE
[INLINE|EXTERNAL]
CALL procedures
automated inlining
multi query rewrite
Compiler
Independence
inline SQL PL
Trigger, Function
SQL PL
Procedures
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
55
DB2 UDB(PC&UNIX) V7.2
Macro PSM
ブランク・ページです
56
Fly UP