Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle PL/SQL Release 12.2.0.1.0 vs. 12.1.0.2.0 – sofort mit Parametern ausführen

Wie von @Alex erwähnt, ist das Erstellen einer Sequenz mit Partitionsklausel eine undokumentierte Funktion wie WMCONCAT . Siehe folgende Erklärung:

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

Sie können hier sehen, dass Oracle intern die Sequenzdefinition in einer partition speichert und daher wird es in DDL angezeigt .

Erstellen Sie eine weitere Sequenz

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

Sie sehen jetzt, dass Oracle diesmal eine Sequenz in einer Partition erstellt und diese daher in DDL-Definition gezeigt hat.

Einige Funktionen, die Oracle für seine eigene interne Verwendung reserviert hatte, bleiben daher undokumentiert.

Wenn Sie diesen Teil in Ihrem Fall entfernen, funktioniert der andere Teil einwandfrei. Siehe unten:

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;