如何编写用于在表中创建新拆分分区的 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 代码?的主要内容,如果未能解决你的问题,请参考以下文章
使用 foreach 循环容器在表中创建新列 - 无法解决“'@P1' 附近的语法错误”错误