Секционированная последовательность Oracle - PullRequest
2 голосов
/ 15 февраля 2010

Я пытаюсь увидеть, существует ли что-то для создания последовательности с логикой разбиения.Мне нужен порядковый номер, который зависит от другого первичного ключа, например:

id_person   sequence id
        1 | 1
        1 | 2
        2 | 1
        3 | 1
        1 | 3

, поэтому последовательность должна зависеть от раздела id_person.Есть ли что-то подобное в oracle, или я должен реализовать это сам на уровне приложения?

спасибо.


Привет, я создал этот пакет и функцию PLSQL один:

PROCEDURE INIT_SEQUENCE(NAME varchar2, pkColumnNameList PARTITIONED_SEQUENCE_PK_COLUMN);
FUNCTION GET_NEXT_SEQUENCE_VALUE(NAME varchar2, pkPartitionColValue PARTITIONED_SEQUENCE_COL_VALUE) RETURN NUMBER;

INIT_SEQUENCE - получить на входе имя, которое будет связано с последовательностью, и список имен столбцов, которые являются фиксированной первичной ключевой частью, которая объединяет последовательность Пример: 'ID_PERSON'

работаэта процедура должна создать таблицу, которая будет управлять приращением последовательности в соответствии со столбцом pkColumnNameList.

GET_NEXT_SEQUENCE_VALUE - получить имя приращения последовательности и значение первичного ключа pkColumnNameList и выполнить следующий шаг: 1) Создатьдинамически SQL для работы 2) dbms_lock.allocate_unique ();заблокировать таблицу 3) проверить, есть ли запись в таблице для значения pk на входе 4) если запись присутствует, обновить запись с максимумом + 1 в столбце последовательности 5) если запись отсутствует, вставить новую записьс 1 в столбце последовательности 6) вернуть новый идентификатор;

Я хотел бы получить комментарий об этом заранее спасибо ...

Ответы [ 3 ]

4 голосов
/ 15 февраля 2010

Является ли фактическое требование, чтобы вторичная последовательность была без пропусков? Если это так, у вас возникла гигантская проблема сериализации / масштабируемости.

Если вам нужно представить последовательность без пробелов для потребления человеком, вы можете использовать фактическую последовательность (или, если на то пошло, временную метку), как советует Ник Пирпонт, и сохранить масштабируемость, вы можете использовать аналитические функции.

Набор данных (t1):

 ID_PERSON SEQUENCE_ID
---------- -----------
         1           1
         2           2
         3           3
         1           4
         1           5
         1           6
         2           7
         3           8
         1           9

SQL:

select * 
  from 
  (select id_person, 
          sequence_id as orig_sequence_id,         
          rank () 
            over (partition by id_person 
                  order by sequence_id) 
            as new_sequence_id
     from t1
  )
 order by id_person, new_sequence_id;

Результат:

ID_PERSON  ORIG_SEQUENCE_ID NEW_SEQUENCE_ID
---------- ---------------- ---------------
         1                1               1
         1                4               2
         1                5               3
         1                6               4
         1                9               5
         2                2               1
         2                7               2
         3                3               1
         3                8               2
0 голосов
/ 15 февраля 2010

То, что вы ищете, не является последовательностью , как заявляет документация Oracle: "Генератор последовательности предоставляет последовательный ряд чисел" .

Вы ищете вычисляемое поле в зависимости от другого, в данном случае первичного ключа. Как и предполагали другие, вам нужно добавить логику в ваш код. Это означает procedure или insert предложение.

0 голосов
/ 15 февраля 2010

Боюсь, вы должны сделать это так:

INSERT INTO t
(
  id_person,
  sequence_id
)
VALUES
( 
  <your_person_id>,
  ( SELECT 1 + NVL( MAX( sequence_id ), 0 )
    FROM t
    WHERE t.id_person = <your_person_id>
  )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...