トップページに戻る    次のmodel句のサンプルへ    前のmodel句のサンプルへ

model句15 until句は後判定繰り返し

SQLパズル

ITERATEとuntilを使ったときの処理順序に関する実験

処理1 ITERATION_NUMBERを宣言 (初期値=0)
処理2 rule適用
処理3 終了条件判定
処理4 ITERATION_NUMBERをインクリメント
処理5 処理2へ戻る

PL/SQL の反復制御構造(繰り返し処理)で表現したのが下記となります。


SQL

select soeji,Val from dual model dimension by (0 as soeji) measures (0 as Val)
rules ITERATE (5) UNTIL (ITERATION_NUMBER = 2) (Val[ITERATION_NUMBER] = ITERATION_NUMBER);

soeji  Val
-----  ---
    0    0
    1    1
    2    2

declare
    I_NUM pls_Integer := 0; -- 処理1 ITERATION_NUMBERを宣言 (初期値=0)
begin
    LOOP
        DBMS_Output.Put_Line(to_char(I_NUM)); -- 処理2 rule適用
        exit when I_NUM = 2;                  -- 処理3 終了条件判定
        I_NUM := I_NUM+1;                     -- 処理4 ITERATION_NUMBER++
    end Loop;                                 -- 処理5 処理2へ戻る
end;
/

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

select soeji,Val from dual model dimension by (0 as soeji) measures (0 as Val)
rules ITERATE (5) UNTIL (1 = 1) (Val[ITERATION_NUMBER] = ITERATION_NUMBER);

soeji  Val
-----  ---
    0    0

declare
    I_NUM pls_Integer := 0; -- 処理1 ITERATION_NUMBERを宣言 (初期値=0)
begin
    LOOP
        DBMS_Output.Put_Line(to_char(I_NUM)); -- 処理2 rule適用
        exit when 1 = 1;                      -- 処理3 終了条件判定
        I_NUM := I_NUM+1;                     -- 処理4 ITERATION_NUMBER++
    end Loop;                                 -- 処理5 処理2へ戻る
end;
/


C#の構文では、この記述が近いと思います。 int ITERATION_NUMBER=0; do { rule適用 } while(終了条件判定しつつ、後置インクリメントでITERATION_NUMBER++)