Реализуйте последовательность, которая увеличивается на значение функции - PullRequest
0 голосов
/ 03 марта 2019

Я хочу создать простую последовательность:

 CREATE SEQUENCE supplier_seq
   MINVALUE 1
  START WITH 3
  INCREMENT BY  4
  CACHE 20000;

Однако я хочу полурандомизировать инкрементные значения с помощью функции, определяемой некоторыми факторами, реализованными на стороне Java.

Я подумал, что первый шаг для проверки этого может выглядеть примерно так:

   CREATE SEQUENCE supplier_seq
       MINVALUE 1
      START WITH 3
     INCREMENT BY  myfunction
      CACHE 20000;

Я попробовал это:

     CREATE SEQUENCE supplier_seq
        MINVALUE 1
      START WITH 3
        INCREMENT BY  (declare 
   rtrnt number;
  begin 
      rtrnt :=semiRandomize();
   end; 
    )
     CACHE 20000;

, что, как я понимаю, смешно ... нодолжен быть какой-то способ сделать что-то подобное.Есть указатели?

1 Ответ

0 голосов
/ 03 марта 2019

Как насчет этого?Не совсем последовательность , но - может удовлетворить ваши потребности.Это функция, которая выбирает случайное число и сохраняет его в таблице с первичным ключом.Если номер уже использовался, он пропускается.Функция проверяет, все ли числа были использованы;если так, это вызывает ошибку.

В этом примере я создаю «последовательность» из 5 чисел (так что она довольно быстро перестает работать).

Таблица и функция:

SQL> create table t_seq (supseq  number constraint pk_tseq primary key);

Table created.

SQL> create or replace function f_supseq
  2    return number
  3  as
  4    l_range  number := 5; -- number of values in a "sequence"
  5    l_seq    number;      -- a new "sequence" number
  6    l_cnt    number;      -- number of used numbers
  7    pragma autonomous_transaction;
  8  begin
  9    select count(*) into l_cnt from t_seq;
 10    if l_cnt < l_range then
 11       -- there are still some available numbers so - let's get them
 12
 13       -- don't let anyone mess with the table
 14       lock table t_seq in exclusive mode;
 15       while l_seq is null loop
 16         begin
 17           insert into t_seq (supseq) values
 18             (round(dbms_random.value(1, l_range)))
 19             returning supseq into l_seq;
 20         exception
 21           when dup_val_on_index then
 22             -- that number has already been used; skip it
 23             null;
 24         end;
 25       end loop;
 26       commit;
 27    else
 28       raise_application_error(-20001, 'No more available numbers');
 29    end if;
 30
 31    return l_seq;
 32  end;
 33  /

Function created.

Извлечениеслучайные значения «последовательности»:

SQL> select f_supseq from dual;

  F_SUPSEQ
----------
         2

SQL> select f_supseq from dual;

  F_SUPSEQ
----------
         4

SQL> select f_supseq from dual;

  F_SUPSEQ
----------
         1

SQL> select f_supseq from dual;

  F_SUPSEQ
----------
         3

SQL> select f_supseq from dual;

  F_SUPSEQ
----------
         5

SQL> select f_supseq from dual;
select f_supseq from dual
       *
ERROR at line 1:
ORA-20001: No more available numbers
ORA-06512: at "SCOTT.F_SUPSEQ", line 28

Содержимое таблицы:

SQL> select * From t_seq;

    SUPSEQ
----------
         1
         2
         3
         4
         5

SQL>
...