在 Oracle PL/SQL 中使用 ONLINE 将非分区 table 转换为分区 table

Convert Non-partition table to partitioned table using ONLINE in Oracle PL/SQL

我知道我们无法将现有的非分区 table 转换为分区 table 但以下来自 Oracle 的 link 建议借助 "ONLINE" 关键字我们可以做到。

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/vldbg/evolve-nopartition-table.html#GUID-5FDB7D59-DD05-40E4-8AB4-AF82EA0D0FE5

CREATE TABLE my_tab ( a NUMBER(38,0), b NUMBER(38,0)); 

ALTER TABLE MY_TAB MODIFY PARTITION BY RANGE (a) INTERVAL (1000) (   
    PARTITION p1 VALUES LESS THAN (1000)) ONLINE;

但它对我不起作用,抛出错误 "Invalid Partition Name"。

我不想使用 dbms_redefinition

如果您使用的是 Oracle 12c Release 2,您可以使用单个 ALTER 将非分区 table 转换为分区:

CREATE TABLE my_tab ( a NUMBER(38,0), b NUMBER(38,0)); 

ALTER TABLE MY_TAB MODIFY PARTITION BY RANGE (a) INTERVAL (1000) (   
    PARTITION p1 VALUES LESS THAN (1000)) ONLINE;

Oracle Database 12c Release 1 (12.1.0.2.0) 且不使用 dbms_redefinition 时,您的选择可能仅限于创建与原始 table 具有相同结构的新分区 table 并复制数据、创建索引、约束等

    CREATE TABLE my_tab_part -- new partitioned table
    PARTITION BY RANGE (a)
       INTERVAL ( 1000 )
       (PARTITION p1 VALUES LESS THAN (1000))
    AS
       SELECT * FROM my_tab;