Như đã đề cập bởi @Alex, tạo một chuỗi với mệnh đề Phân vùng là tính năng không có tài liệu như WMCONCAT
. Xem phần giải thích bên dưới:
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
Bạn có thể thấy ở đây rằng oracle nội bộ lưu định nghĩa trình tự trong một số partition
và do đó nó hiển thị trong DDL
.
Tạo một chuỗi khác
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
Bây giờ bạn thấy lần này Oracle đã tạo trình tự trong một số partiton và do đó hiển thị điều đó trong DDL definiton.
Một số tính năng mà oracle đã dành riêng cho việc sử dụng nội bộ của chính nó, do đó được giữ không có tài liệu.
Trong trường hợp của bạn nếu bạn loại bỏ phần đó thì phần khác sẽ hoạt động tốt. Xem bên dưới:
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;