Сделать приращение столбца последовательности в зависимости от условий? - PullRequest
0 голосов
/ 02 мая 2019

Справочная информация

Итак, вот предыстория этого вопроса. В настоящее время у нас есть несколько идентификаторов номеров материалов (UNPN, UDEN, UXXN и т. Д.), Каждый из которых имеет свой порядковый номер (UNPN0001, UNPN0002, UNPN0003 и т. Д.)

Когда пользователь запрашивает новый номер спецификации, скажем, новый номер UNPN. Если последний номер был UNPN0003, то пользователь должен иметь возможность зарезервировать UNPN0004.

Моя первоначальная мысль:

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

Проблема:

Итак, проблема, с которой я столкнулся, заключается в том, что для этого метода у нас в настоящее время имеется более 50 идентификаторов материалов. Так что это будет означать, что мне придется создать 1 таблицу для каждого идентификатора с собственным столбцом автопоследовательности.

Что я ищу:

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

Будем благодарны за любые предложения.

Спасибо,

1 Ответ

1 голос
/ 02 мая 2019

Вы указали, что используете Oracle.Oracle имеет объекты уровня базы данных, известные как последовательности, созданные для такого рода вещей.Они очень производительные.Вы хотели бы сделать одну последовательность для каждого из ваших идентификаторов.Вам нужно сделать это только один раз для каждого идентификатора.

CREATE SEQUENCE UNPN;  -- Starts a 1 by default
CREATE SEQUENCE UDEN START WITH 50;
CREATE SEQUENCE UXXN MAXVALUE 9999 CYCLE; -- This one will recycle back to 0001 after it hits 9999

Далее, когда вам понадобится новое значение для данной последовательности, вы можете просто выбрать его:

SELECT 'UNPN'||TO_CHAR(UNPN.NEXTVAL,'FM0000') FROM DUAL;

Чтобы сделать егопроще / динамичнее, вы можете определить функцию для получения нового значения по имени:

create or replace function get_named_seq(p_sequence varchar2) return varchar2
is
  l_sql VARCHAR2(4000);
  l_Result varchar2(30);
begin
  select 'select '''||sequence_name||'''||to_char('||sequence_name||'.nextval,''FM0000'') from dual'
    into l_sql
    from user_sequences
   where sequence_name = upper(p_sequence);

  execute immediate l_sql
     into l_Result;
   return l_result;
end;
/

Приведенная выше функция вызовет исключение NO_DATA_FOUND, если запрошенная последовательность не существует, и даже если она использует динамический SQLон должен быть защищен от SQL-инъекций, так как фактический динамический оператор SQL никогда напрямую не касается входного параметра.вы можете использовать его как этот или любой другой, где вы можете использовать функцию:

INSERT into MyTable (ID, Data) values (get_named_seq('UXXN'), 'some data');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...