2013-03-10 7 views
0

Последовательность оракулов предназначена для возврата автоматически увеличивающихся чисел. Мне интересно, могу ли я реализовать настраиваемую последовательность, возвращающуюся из пула значений, который я вставлял, поэтому я могу сказать последовательность, которую, как ожидается, вернется.Как реализовать пользовательскую последовательность оракула?

В любом случае реализовать это? или альтернативу, например добавление триггера или функций oracle или что-то еще?

Или даже использовать таблицу сохранения значения, но как это сделать лучше производительность, как последовательность Oralce

I have this, but not sure is it the best one. 
create table your_table(
    gap_from int, 
    gap_to int 
); 

insert into your_table values(99999, 9998888); 
insert into your_table values(2, 7); 
insert into your_table values(200, 10000); 
insert into your_table values(10001, 300000); 

create table2 as select 
      gap_from, 
      1 + nvl(sum(gap_to - gap_from + 1) over (order by gap_from rows between unbounded preceding and 1 preceding), 0) as seq_from, 
      sum(gap_to - gap_from + 1) over (order by gap_from) as seq_to 
     from your_table; 

create sequence your_new_seq; 


create or replace function get_PK_inside_gap return number as 
    new_seq_val number; 
    PK_inside_gap number; 
begin 
    select your_new_seq.nextval into new_seq_val from dual; 
    execute immediate ' 
    select 
     new_seq_val + gap_from - seq_from 
    from 
     (select :1 as new_seq_val from dual) 
     join (
     table2 
    ) on new_seq_val between seq_from and seq_to' 
    into PK_inside_gap using new_seq_val; 
    return PK_inside_gap; 
end; 
+0

Это может зависеть от того, что вы хотите получить, можете ли вы привести пример? –

+0

Например, я хочу разработать индивидуальную последовательность, которая возвращает число из диапазонов [2,7], [200,10000], [10001, 300000], [99999,9998888] и т. Д. ... поэтому здесь я хочу чтобы получить автоматическое увеличение с определенного диапазона. –

ответ

0

Создать таблицу с записями, которые вы хотите, а затем прикрепить таблицу в памяти для хорошей производительности , Когда значения «используются», вы можете обновить их, чтобы установить флаг состояния.

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

1

Для возврата только значения из диапазона от 5 до 10:

create sequence seq1 start with 5 maxvalue 10; 

Для возврата только значения от 100000 до 999990, в скачках 10:

create sequence seq2 start with 100000 maxvalue 999990 increment 10; 
0

Вы можете создать обычную последовательность и изменить ее результат в соответствии с вашим списком пробелов.

create table your_table(
    gap_from int, 
    gap_to int 
); 

insert into your_table values(99999, 9998888); 
insert into your_table values(2, 7); 
insert into your_table values(200, 10000); 
insert into your_table values(10001, 300000); 

create sequence your_new_seq; 


create or replace function get_PK_inside_gap return number as 
    new_seq_val number; 
    PK_inside_gap number; 
begin 
    select your_new_seq.nextval into new_seq_val from dual; 
    execute immediate ' 
    select 
     new_seq_val + gap_from - seq_from 
    from 
     (select :1 as new_seq_val from dual) 
     join (
     select 
      gap_from, 
      1 + nvl(sum(gap_to - gap_from + 1) over (order by gap_from rows between unbounded preceding and 1 preceding), 0) as seq_from, 
      sum(gap_to - gap_from + 1) over (order by gap_from) as seq_to 
     from your_table 
    ) on new_seq_val between seq_from and seq_to' 
    into PK_inside_gap using new_seq_val; 
    return PK_inside_gap; 
end; 

Позовите get_PK_inside_gap, чтобы получить последовательность из не используемых ПК: 2,3,4,5,6,7,200,201, ...

0

чувак я думаю, что это может помочь вам, как правило, после создания последовательность, которую вы не можете назначить start с параметром, поэтому лучше отбросить эту последовательность и воссоздать ее;

create or replace 
procedure SEQ_alter(start_with in number,end_with in number,seq_name varchar2) 
    as 
    sql_qury varchar2(148); 
    drop_qury varchar2(148); 
    begin 
    drop_qury:='drop sequence '||seq_name ; 
    execute immediate drop_qury; 
    sql_qury:='create sequence '||seq_name|| ' start with '|| to_number(start_with) ||' maxvalue '|| to_number(end_with); 

    execute immediate sql_qury; 
    end; 
Смежные вопросы