Oracle последовательность не существует

Обновлено: 07.07.2024

Возможность, которой не удивишь нынче пользователей Oracle, DB2, PostgreSQL и множества других реляционных баз данных, наконец-то появилась и в MS SQL Server. На арене Sequence!

Sequence – генерирует последовательность чисел так же как и identity. Однако основным плюсом sequence является то, что последовательность не зависит от какой-либо конкретной таблицы и является объектом базы данных.

Рассмотрим пример скрипта написанного на SQL Server 2008. Создание простой таблицы с двумя колонками, одна из которых будет автоинкрементной.


Похожим образом создадим еще одну таблицу.

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

Общий синтаксис для команды выглядит так:

Создадим последовательность чисел:

После выполнения указанного скрипта, в браузере объектов базы, в узле Sequences можно найти наш объект.


После того как объект создан, можно его использовать в создании и заполнении таблиц как показано ниже:

Если создать вторую таблицу в таком же духе, то можно снова использовать GenerateNumberSequence и получать сквозную нумерацию объектов.

Последовательность (Sequence) которую мы создали, можно посмотреть в системном каталоге sys.sequences.


Это не вся доступная информация по sequence, просто эти колонки нам понадобятся далее. Чтобы получить всю информацию замените имена колонок на звездочку. Про Is_Exhausted будет упомянуто позднее.

  • Int
  • Smallint
  • Tinyint
  • Bigint
  • Decimal
  • Numeric

Проверим на практике, что скажет SQL Server при задании начального числа вне допустимого диапазона. Начнем с левой границы.

An invalid value was specified for argument 'START WITH' for the given data type.

Что и ожидалось. Теперь нарушим правую границу.


Сервер сообщит нам об ошибке так:

The sequence object 'GenerateNumberSequence' cache size is greater than the number of available values; the cache size has been automatically set to accommodate the remaining sequence values.

И если мы обратим внимание на колонку Is_Exhausted в каталоге sys.sequences, то увидим, что значение стало равно 1. Что говорит нам о невозможности дальнейшего использования данной последовательности.


При попытке создать таблицу с использованием такой последовательности, сервер выдаст ошибку:

The sequence object 'GenerateNumberSequence' has reached its minimum or maximum value. Restart the sequence object to allow new values to be generated.

Это можно трактовать как просьбу движка рестартовать указанную последовательность. Для этого необходимо воспользоваться конструкцией RESTART WITH.

Значение должно быть в пределах допустимого диапазона объявленного типа. Далее последовательность начнется с указанного значения, не со следующего.


А потом выполнить скрипт:

То результат будет таким:

Последовательность началась с заданного значения.

Получить минимальные и максимальные значения можно из каталога sys.sequences.

MIN и MAX значения

Для последовательностей можно задавать границы допустимых значений. Попробуем выполнить такой скрипт ниже.

The start value for sequence object 'GenerateNumberSequence' must be between the minimum and maximum value of the sequence object.

Далее можем представить, что следующее значение в последовательности нарушает границу. В таком случае получим ошибку:

The sequence object 'GenerateNumberSequence' has reached its minimum or maximum value. Restart the sequence object to allow new values to be generated.

  • Использовать служебные слова Restart или Restart With.
  • Использовать опцию CYCLE

Опция CYCLE

Данная опция зацикливает последовательность и, достигнув максимального значения, последовательность продолжается с минимального. Например:


После того как максимальное значение было достигнуто, результаты станут такими:

Для выборки использовался запрос:

Если внимательно посмотреть на вывод, то можно заметить, что записи были перепутаны. Если бы мы не использовали последовательности, то вывод был бы

Но из-за того, что вторая запись пересекла диапазон допустим значений, номер был сброшен на минимальное значение, заданное для последовательности (10). Если сейчас посмотреть в каталог sys.sequences, то будет видно, что текущее значение равняется 10.

В следующий раз, заполнение таблицы могло бы быть таким:

В этот момент Sequence проверит порядок в котором записи будут вставлены и так как “Violet” идет раньше “Tape” и текущий номер равен 10, записи будут вставлены как:

Следующее_значение =Текущее_значение +Сдвиг т.е. 10 +1 будет присвоено для “Violet”. Теперь значение Sequence = 11 и для второй записи значение будет 12 следуя то же самой формуле.

Опция NO CYCLE


Поведение такой опции уже рассматривалось в самом начале, и является значением по умолчанию при создании Sequence.

Sequence в сочетании с Over()

Можно использовать последовательность вместе с выражением Over для генерирования порядковых номеров как показано ниже:


Можно заметить, что записи были отсортированы и последовательность была применена верно к сохраненным данным. Это означает, что записи сначала сортируются и только потом применяется нумерация последовательности.

Ограничения использования Next Value для функций.

  • Проверкой ограничений (constraints)
  • Значениями по умолчанию
  • Вычисляемыми колонками
  • Представлениями (views)
  • Пользовательскими функциями
  • Пользовательскими функциями агрегации
  • Подзапросами
  • СТЕ (Common Table Expression)
  • Подтаблицами
  • Выражением TOP
  • Выражением Over
  • Выражением Output
  • Выражением On
  • Выражением Where
  • Выражением Group By
  • Выражением Having
  • Выражением Order By
  • Выражением Compute
  • Выражением Compute By

Функция sp_sequence_get_range

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

Вот что будет в результате выполнения:


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

Я не могу найти ошибку, когда пытаюсь создать последовательность для своей таблицы.

Когда я пытаюсь вставить некоторые данные в свою таблицу с последовательностью, она говорит, что ее не существует, но я ее создал. Кроме того, я не уверен, что мне нужно preparedStatement.setInt(1, seq_id.nextval); это дает ошибку, но я не совсем уверен, как бы я это сделал

3 ответа

У меня есть модель с именем Carrier. в моем контроллере, когда я делаю Carrier.create(data) , я получаю эту ошибку: OCIError: ORA-02289: sequence does not exist: select carriers_seq.nextval id from dual Это мой код в моем контроллере: class CarriersController < ActionController::Base def index.

Решением может быть добавление имени схемы (владельца) перед именем последовательности:

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

Однако, если вам действительно нужно сделать это таким образом, текущее решение может быть улучшено, чтобы учесть следующие моменты:

  • Выполняйте операторы CREATE только тогда, когда объекты еще не существуют в DB. Это можно сделать, предварительно проверив представление словаря данных USER_OBJECTS .
  • Используйте обычный Statement вместо PreparedStatement для выполнения DDL (подготовленные операторы полезны только для операций DML , использующих входные переменные)
  • Обрабатывать JDBC ресурсы ( Connection / Statement / ResultSet ) кратко и безопасно через конструкцию try-with-resources

Вот как может выглядеть код:

У меня есть table_1 с последовательностью (я использую базу данных Oracle 11g), и я хочу извлечь строки из другой таблицы, чтобы загрузить их в мою table_2 с помощью Talend Open Studio, но у меня есть эта ошибка: ORA-02289: sequence does not exist error кто-то может мне помочь ?

Вы готовите оператор с одним текстом SQL и выполняете оператор с двумя разными текстами SQL;

. что на самом деле недопустимо в соответствии с документами;

int executeUpdate(строка sql) бросает SQLException
Выполняет данный оператор SQL, который может быть оператором INSERT, UPDATE или DELETE или оператором SQL, который ничего не возвращает, например оператором SQL DDL.
метод Note:This не может быть вызван на PreparedStatement или CallableStatement.

Что вам нужно сделать, так это подготовить и выполнить два разных оператора;

Похожие вопросы:

Я создал последовательность в базе данных ORACLE 10g CREATE SEQUENCE test_seq START WITH 1 INCREMENT BY 3 NOMAXVALUE NOMINVALUE NOORDER NOCYCLE NOCACHE; У меня также есть таблица в базе данных.

ORA-02289: последовательность не существует, ошибка в hibernbate

У меня есть приложение ColdFusion ORM, которое использует последовательность oracle в качестве генератора поля первичного ключа. Я проверил, что могу получить доступ к последовательности как.

У меня есть модель с именем Carrier. в моем контроллере, когда я делаю Carrier.create(data) , я получаю эту ошибку: OCIError: ORA-02289: sequence does not exist: select carriers_seq.nextval id from.

У меня есть table_1 с последовательностью (я использую базу данных Oracle 11g), и я хочу извлечь строки из другой таблицы, чтобы загрузить их в мою table_2 с помощью Talend Open Studio, но у меня.

Когда я генерирую SQL с помощью PowerDesigner и запускаю его в Oracle, он выдает ошибку Warning:Trigger создание с ошибками компиляции create trigger tib_material_classify before insert on.

Я разрабатываю очень простое приложение hibernate и застрял с ошибкой: ERROR: ORA-02289: sequence does not exist. Прилагаются соответствующие файлы. Я вижу, что этот вопрос уже был задан в stack.

Я попытался обновить hibernate с 4 до 5 в моем проекте с spring 4.2 версия. После этого обновления я обнаружил следующую ошибку в трассировке стека, когда я вызвал метод для обновления.

Я изменил автоматический увеличенный идентификатор с аннотацией

тем не менее ошибка остается.

вы также можете поместить :

и пусть DateBase управляет приращением первичного ключа:

необходимо указать <prop key="hibernate.id.new_generator_mappings">false</prop> .. смотрите ссылке и ссылке.

работа с Spring Boot

поместите строку ниже .приложение.свойства

решение

объяснение

На Hibernate 4.X этот атрибут по умолчанию имеет значение true .

Я получал ту же ошибку "com.mysql.интерфейс jdbc.исключения.jdbc4.MySQLSyntaxErrorException: таблица ' mylocaldb.hibernate_sequence' не существует".

используя spring mvc 4.3.7 и hibernate версии 5.2.9, приложение сделано с использованием конфигурации на основе spring java. Теперь я должен добавить hibernate.id.new_generator_mappings свойство упоминается @Eva Mariam в моем коде следующим образом:

и он работал как шарм.

Это причина этой ошибки:

Это будет выглядеть как база данных, которую вы используете генерирует идентификаторы. Для MySql или HSQSL существуют поля инкремента, которые автоматически увеличиваются. В Postgres или Oracle они используют таблицы последовательностей. Поскольку вы не указали имя таблицы последовательности, она будет искать таблицу последовательности с именем hibernate_sequence и использовать ее по умолчанию. Поэтому у вас, вероятно, нет такой таблицы последовательности в вашей базе данных, и теперь вы получаете эту ошибку.

в спящем режиме 5.x, вы должны добавить set hibernate.id.new_generator_mappings к false в hibernate.контекстно-свободная грамматика.xml

  • Hibernate ORM 5.2.1,
  • Hibernate ORM 5.1.1,
  • Hibernate ORM 5.0.11

Я добавил последовательность гибернации в postgres. Запустите этот запрос в Редакторе PostGres:

я узнаю плюсы / минусы использования запроса, но для тех, кто нуждается в помощи, может использовать это.

У меня проблема с получением моего SEQUENCE. Я создал последовательность как администратор и предоставил права выбора и изменения другому пользователю.

Когда я это сделаю :

Я вижу свой SEQUENCE в списке.

Но я не могу получить доступ к последовательности в моем коде. с помощью :

Что я делаю не так?

3 ответа

Вам либо придется полностью квалифицировать свою последовательность с помощью:

Или создайте для него публичный синоним:

Убедитесь, что вы создаете последовательность в верхнем регистре, даже если вы используете нижний регистр в инструкции trigger / select.

Вы пробовали использовать полное имя в своем коде?

Если у вас уже есть, вы можете отредактировать вопрос, чтобы опубликовать вывод следующих команд. "OWNER", "USER" в ваших примерах немного сбивают с толку.

выберите последовательность, владелец из all_sequences, где sequence_name = 'TOT_SEQ'; выберите лицо, предоставляющее право, имя таблицы, привилегию из all_tab_privs, где sequence_name = 'TOT_SEQ';

Похожие вопросы:

Я создал последовательность в базе данных ORACLE 10g CREATE SEQUENCE test_seq START WITH 1 INCREMENT BY 3 NOMAXVALUE NOMINVALUE NOORDER NOCYCLE NOCACHE; У меня также есть таблица в базе данных.

ORA-02289: последовательность не существует, ошибка в hibernbate

У меня есть приложение ColdFusion ORM, которое использует последовательность oracle в качестве генератора поля первичного ключа. Я проверил, что могу получить доступ к последовательности как.

У меня есть table_1 с последовательностью (я использую базу данных Oracle 11g), и я хочу извлечь строки из другой таблицы, чтобы загрузить их в мою table_2 с помощью Talend Open Studio, но у меня.

Когда я генерирую SQL с помощью PowerDesigner и запускаю его в Oracle, он выдает ошибку Warning:Trigger создание с ошибками компиляции create trigger tib_material_classify before insert on.

Я разрабатываю очень простое приложение hibernate и застрял с ошибкой: ERROR: ORA-02289: sequence does not exist. Прилагаются соответствующие файлы. Я вижу, что этот вопрос уже был задан в stack.

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

Читайте также: