sql >> Base de Datos >  >> RDS >> Oracle

Oracle PL/SQL versión 12.2.0.1.0 frente a 12.1.0.2.0:ejecución inmediata con parámetros

Como mencionó @Alex, crear una secuencia con una cláusula de partición es una característica no documentada como WMCONCAT . Vea la explicación a continuación:

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

Puede ver aquí que Oracle guarda internamente la definición de secuencia en alguna partition y por lo tanto se muestra en DDL .

Crear otra secuencia

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

Ahora, esta vez, Oracle creó una secuencia en alguna partición y, por lo tanto, la mostró en la definición DDL.

Oracle había reservado algunas funciones para su propio uso interno, por lo que no se documentaron.

En su caso, si quita esa parte, la otra parte funcionará bien. Ver a continuación:

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;