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