1

这是我的变更声明:

alter table demo_table
split partition PART_35 values('9999') into (partition PART_35, partition PART_36)

该表已经由 emp_id 上的列表分区组成,其中 PART_35 是创建的最后一个分区,它具有 ORACLE 中使用的默认值,而 PART_36 是我创建的新分区。

该过程将采用两个参数:

  1. 表名
  2. Emp_id(上面代码中9999是我要创建分区的emp_id,基本上我是
    在emp_id上创建分区)

我陷入困境的一点是如何将 part_35 和 part_36 视为广义的。因此,对于每个分区,如果用户传递 emp_id 和表名,则将创建一个新分区,将 emp_id 9999 的 part_35 和 part_36 作为 oracle 中默认值的分区。注意:具有默认值的分区将是每个表的最后一个分区。

谢谢 :)

4

1 回答 1

0

当你创建一个带有列表分区的表时,你会给它一个默认的分区名称,并在你需要一个新分区时将其拆分。

让我们稍微检查一下。例如,您有一个名为 demo_table 的表,对吗?

CREATE TABLE DEMO_TABLE
(
ID NUMBER,
NAME VARCHAR2(100 CHAR)
)
PARTITION BY LIST (ID) 
(
     PARTITION PDEFAULT VALUES (DEFAULT)
);

并在需要时创建一个过程来拆分其分区。

CREATE OR REPLACE PROCEDURE DEMO_PROCEDURE (TABLENAME VARCHAR2,PID VARCHAR2)
IS
V_CONTROL NUMBER;
BEGIN
--Controls if any of the given partitions created before??
   SELECT COUNT (*)
     INTO V_CONTROL
     FROM USER_TAB_PARTITIONS
    WHERE     TABLE_NAME = TABLENAME
          AND PARTITION_NAME = 'P' || PID;

   IF V_CONTROL > 0
   THEN
      EXECUTE IMMEDIATE
            'ALTER TABLE '||TABLENAME ||' DROP PARTITION P'|| PID;
   END IF;

   EXECUTE IMMEDIATE
         'ALTER TABLE '||TABLENAME ||' SPLIT PARTITION PDEFAULT VALUES('
      || PID
      || ') INTO ( PARTITION P'
      || PID
      || ',PARTITION PDEFAULT)';

END DEMO_PROCEDURE;
/

下面的代码应该可以工作。

官方文档。

alter table demo_table
split partition YOUR_DEFAULT_PARTITION(In your case it is PART_35) values('9999') into 
(partition YOUR_NEW_PARTITION, partition YOUR_DEFAULT_PARTITION(In your case it is PART_35))
于 2020-03-01T17:27:25.097 回答