Oracle SQL ROWNUM и NEXTVAL - PullRequest
       19

Oracle SQL ROWNUM и NEXTVAL

0 голосов
/ 25 мая 2018

Я создал последовательность

CREATE SEQUENCE name_seq
START WITH 1
INCREMENT BY   1
NOCACHE
NOCYCLE;

Затем использовал ее в своем запросе:

select Name, ROWNUM, name_seq.NEXTVAL
from myTable;

Результат выглядит примерно так:

+----+------+-------+
|Name|ROWNUM|NEXTVAL|
+----+------+-------+
|A   |     1|      1|     
|B   |     2|      2|
|C   |     3|      3| 
|D   |     4|      4|
|E   |     5|      5|
|F   |     6|      6|
|G   |     7|      7|
|H   |     8|      8|
|I   |     9|      9|
|J   |    10|     10|
+----+------+-------+

И из этого, что я хочу, чтобы вывод был использовать следующее значение моей последовательности каждый раз после числа, которое я объявлю.Например, я буду использовать 4. Выходные данные должны быть такими:

При первом запуске:

+----+------+-------+
|Name|ROWNUM|NEXTVAL|
+----+------+-------+
|A   |     1|      1|     
|B   |     2|      1|
|C   |     3|      1| 
|D   |     4|      1|
|E   |     5|      2|
|F   |     6|      2|
|G   |     7|      2|
|H   |     8|      2|
|I   |     9|      3|
|J   |    10|      3|
+----+------+-------+

Затем при втором запуске:

+----+------+-------+
|Name|ROWNUM|NEXTVAL|
+----+------+-------+
|A   |     1|      4|     
|B   |     2|      4|
|C   |     3|      4| 
|D   |     4|      4|
|E   |     5|      5|
|F   |     6|      5|
|G   |     7|      5|
|H   |     8|      5|
|I   |     9|      6|
|J   |    10|      6|
+----+------+-------+

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Просто вычтите последний номер последовательности.

with seq_cur_val as(
    select last_number seq_cv
    from user_sequences
    where sequence_name='NAME_SEQ'
)
select name, rownum,
    floor((name_seq.nextval-seq_cv)/4)+1
from myTable,seq_cur_val;
0 голосов
/ 25 мая 2018

попробуйте,

CREATE SEQUENCE name_test_seq
START WITH 1
INCREMENT BY   1
NOCACHE
NOCYCLE;

CREATE OR REPLACE FUNCTION get_next_val     (p_num NUMBER) RETURN NUMBER
IS
BEGIN
    IF p_num = 1 THEN
        RETURN name_test_seq.NEXTVAL;
    ELSE
        RETURN name_test_seq.CURRVAL;
    END IF;
END;
/

select rownum rown, get_next_val(MOD(rownum, :p_num))
  from dual
connect by rownum <= 10
0 голосов
/ 25 мая 2018

Попробуйте это:

Select name,rownum,floor((name_seq.NEXTVAL-1)/4)+1 fl
from myTable
...