2017-12-25 29 views
1

HSQLDBでは、シーケンスのカウンターをNで上げようとします。N> 1のときにどのようにするのかの例は見つかりませんでしたので、呼び出しましたNEXT VALUE FOR my_sequence Nしかし、それもうまくいかなかった。例えばHSQLDB:シーケンスのカウンターをNで上げる

DROP PROCEDURE IF EXISTS my_procedure; 
CREATE PROCEDURE my_procedure(OUT my_output INTEGER, OUT out_a_1 INTEGER, OUT out_a_2 INTEGER, OUT out_a_3 INTEGER, IN my_input INTEGER) 
     MODIFIES SQL DATA -- NO SQL 
     BEGIN ATOMIC 

       DECLARE a_1 BIGINT; 
       DECLARE a_2 BIGINT; 
       DECLARE a_3 BIGINT; 

       SET my_output = my_input; 

       SET a_1 = NEXT VALUE FOR my_sequence; 
       SET a_2 = NEXT VALUE FOR my_sequence; 
       SET a_3 = NEXT VALUE FOR my_sequence; 

       SET out_a_1 = a_1; 
       SET out_a_2 = a_2; 
       SET out_a_3 = a_3; 
     END; 

結果:カウンタは1だけ上げられるようにout_a_1 == out_a_2 == out_a_3

は、それが一回の操作でNだけカウンタを上げることは可能ですか?

もしそうでない場合は、どうすればいいですか?

答えて

1

シーケンス値をテーブルに挿入する必要があります。各行インサートは、シーケンスをインクリメントします。

DECLARE TABLE T (ID INT) 
INSERT INTO T VALUES (NEXT VALUE FOR my_sequence), (NEXT VALUE FOR my_sequence) 

上記の例を使用して、シーケンスを2つずつ増やすことができます。

+0

ありがとうございます。私はそのようなことをした。これが意図された方法であることを確認できたらうれしいです。 – rapt

+0

ところで、シーケンスを使って、連続する 'NEXT VALUE'呼び出しをアトミック(例:プロシージャ内で)にしない限り、2人のユーザー/セッションが同じ値を取得するという問題があるかもしれません。この 'INSERT'にはこのような問題はありませんか?また、シーケンスは 'BIGINT'を作成しませんか? – rapt

+0

セッションは、別のセッションによって返された同じ値を返すことはありません。 Atomicityはコンテキストに関係なく強制されます。 – fredt

関連する問題