Oracle PL / SQL Release 12.2.0.1.0 против 12.1.0.2.0 - выполнить немедленно с параметрами - PullRequest
0 голосов
/ 17 мая 2018
DECLARE
  max_id INTEGER;
BEGIN
  SELECT MAX(ID) + 1 INTO max_id FROM MY_TABLE;

  EXECUTE IMMEDIATE 'CREATE SEQUENCE  MY_TABLE_ID  MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH ' || max_id || ' CACHE 100 NOORDER  NOCYCLE  NOPARTITION';

END;

выше дает мне ORA-00933: SQL command not properly ended при выполнении на

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production

и работает без ошибок на

   Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production

После того, как я изменил оператор execute на приведенный ниже, он работает в обеих версиях без каких-либо ошибок.

 CREATE SEQUENCE  MY_TABLE_ID  MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH ' || max_id || '''

Это известная проблема?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Как уже упоминалось @Alex, создание последовательности с предложением Partition является недокументированной функцией, такой как WMCONCAT.См. Объяснение ниже:

sql> create sequence s1;

Sequence created.

sql> select s1.nextval from dual;

     NEXTVAL
     ---------
     1

sql> select dbms_metadata.get_ddl('SEQUENCE','S1') from dual;

DBMS_METADATA.GET_DDL('SEQUENCE','S1')
--------------------------------------------------------------------------------

 CREATE SEQUENCE  "SCOTT"."S1"  MINVALUE 1 MAXVALUE 99999999999999999999999999
99 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER  NOCYCLE  NOPARTITION

Здесь вы можете видеть, что оракул внутренне сохраняет определение последовательности в некотором partition и, следовательно, оно показывает в DDL.

Создайте другую последовательность

sql> create sequence s2 partition;

  Sequence created.

sql> select s2.nextval from dual;

     NEXTVAL
---------------
      4103920000000000000000000000000001

sql> select dbms_metadata.get_ddl('SEQUENCE','S2') from dual;

DBMS_METADATA.GET_DDL('SEQUENCE','S2')
--------------------------------------------------------------------------------

 CREATE SEQUENCE  "SCOTT"."S2"  MINVALUE 1 MAXVALUE 99999999999999999999999999
99 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER  NOCYCLE  PARTITION 100000000

Теперь вы видите, что на этот раз Oracle создал последовательность в некотором разделе и, следовательно, показал, что в определении DDL.

Некоторые функции oracle зарезервированы для его собственного внутреннего использования, что, следовательно, хранится без документов.

В вашем случае, если вы удалите эту часть, другая часть будет работать нормально.Смотрите ниже:

DECLARE
  max_id INTEGER;
BEGIN
  SELECT MAX(ID) + 1 INTO max_id FROM MY_TABLE;

  EXECUTE IMMEDIATE 'CREATE SEQUENCE  MY_TABLE_ID  MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH '|| max_id||'  CACHE 100 NOORDER  NOCYCLE  ' ;
END;
0 голосов
/ 17 мая 2018

Нет опции NOPARTITION в соответствии с документацией 12cR1 или 12cR2 .

Устав работает в 12cR1, но, похоже, игнорируется без предупреждения, поскольку он, похоже, ничего не делает - хотя может быть и под капотом, как показывает демоверсия @ XING.И это ошибки ожидаются в 12cR2 и 11gR2.

Так что кажется недокументированной (согласно поиску MoS) ошибкой в ​​12cR1, поскольку она не вызывает ошибку, когданеверная опция включена.За исключением ... в MoS есть несколько обращений, которые косвенно ссылаются на него как на действительные, например, ошибка 23210794, где указание параметра отображается в качестве обходного пути;наоборот, ID документа 2253744.1 упоминает ключевое слово

PARTITION / NOPARTITION, которое не является функцией 12.1, использовалось при создании последовательности

Интересно, что all_sequencesview получил столбец partition_count в 12cR1 , но затем снова потерял его в 12cR2 .(Чисто предположение, но, возможно, это связано с внутренней реализацией столбцов автоинкрементации для секционированных таблиц, и на самом деле не предназначено для показа для других последовательностей.)

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

Но решение вашей проблемы - удалить ключевое слово NOPARTITION из вашего утверждения.

...