如何编写用于在表中创建新拆分分区的 plsql 代码?

Posted

技术标签:

【中文标题】如何编写用于在表中创建新拆分分区的 plsql 代码?【英文标题】:How can I write a plsql code for creating a new split partition in a table? 【发布时间】:2020-02-29 08:25:57 【问题描述】:

这是我的修改声明:

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

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

该过程将采用两个参数:

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

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

谢谢:)

【问题讨论】:

【参考方案1】:

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

让我们稍微检查一下。例如,您有一个名为 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;
/

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

Official Docs.

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))

【讨论】:

您好,这是我的alter table demo_table split partition PART_35 into (partition WH_PART_35 values ('9999'), partition PART_36)的alter语句; 我想通过命名 part_36 将默认分区保留为最后一个分区,我的新分区将是 part_35,这是之前默认分区的名称。非常感谢您的帮助。 :) 但是你为什么需要它呢?当您创建带有分区的表时,每个分区只有一个默认分区。您想拆分该分区并更改其顺序吗?但是,如果您的 id 列是唯一的,您是否认为使用 liste 分区可能有点矫枉过正?

以上是关于如何编写用于在表中创建新拆分分区的 plsql 代码?的主要内容,如果未能解决你的问题,请参考以下文章

通过动态增加拆分在 oracle 中创建拆分分区

使用 foreach 循环容器在表中创建新列 - 无法解决“'@P1' 附近的语法错误”错误

无法编写用于在数据库中创建新用户的 GraphQL Mutation

测试变量向量并在表上求和,在R中创建新列

如何合并两个查询集并在 django 中创建新的查询集

记录未使用 PLSQL 过程保存在表中