在 Oracle 19c 中的两个分区表之间移动数据

问题描述 投票:0回答:1

我正在尝试在两个分区表之间移动数据。下面是示例脚本。我正在研究 Oracle 19c 并使用 12c 创建表进行交换的功能。请提出缺少的内容。

your text

如何在两个分区表之间移动分区。这是 DW 环境,其中 SRC 应包含最多 7 天的数据并继续移动到目标表。如果有更好的方法在两个表之间移动数据,请也提出建议。源表和目标表都驻留在单个架构中,但位于两个不同的 TS 中。

--Source table creation
DROP TABLE STG_SRC;
CREATE TABLE STG_SRC
(
    STG_SRC_ID NUMBER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    NM VARCHAR2(4000),
    BATCH_DT_ID NUMBER,
    CONSTRAINT PK_STG_SRC PRIMARY KEY (STG_SRC_ID)
);

ALTER TABLE STG_SRC MODIFY PARTITION BY LIST (BATCH_DT_ID) AUTOMATIC (PARTITION INITIAL_PARTITION VALUES (20240101)) ONLINE UPDATE INDEXES;

INSERT INTO STG_SRC (BATCH_DT_ID, NM) VALUES (20240201,'Robert');
INSERT INTO STG_SRC (BATCH_DT_ID, NM) VALUES (20240202,'Keith');
INSERT INTO STG_SRC (BATCH_DT_ID, NM) VALUES (20240203,'Mike');
INSERT INTO STG_SRC (BATCH_DT_ID, NM) VALUES (20240204,'Sean');
INSERT INTO STG_SRC (BATCH_DT_ID, NM) VALUES (20240205,'Alex');
COMMIT;

SELECT * FROM STG_SRC;
SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'STG_SRC';

--Target table creation
DROP TABLE STG_TGT
CREATE TABLE STG_TGT
(
    STG_TGT_ID NUMBER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    NM VARCHAR2(4000),
    BATCH_DT_ID NUMBER,
    CONSTRAINT PK_STG_TGT PRIMARY KEY (STG_TGT_ID)
);

ALTER TABLE STG_TGT MODIFY PARTITION BY LIST (BATCH_DT_ID) AUTOMATIC (PARTITION INITIAL_PARTITION VALUES (20240101)) ONLINE UPDATE INDEXES;

SELECT * FROM STG_TGT;
SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'STG_TGT';


--Temp table creation
DROP TABLE STG_SRC_TMP;
CREATE TABLE STG_SRC_TMP FOR EXCHANGE WITH TABLE STG_SRC;

--Exchange partition
ALTER TABLE STG_SRC EXCHANGE PARTITION FOR (20240201) WITH TABLE STG_SRC_TMP INCLUDING INDEXES WITHOUT VALIDATION UPDATE GLOBAL INDEXES;
SELECT * FROM STG_SRC WHERE BATCH_DT_ID = 20240201; -- 0 RECORDS
SELECT * FROM STG_SRC_TMP WHERE BATCH_DT_ID = 20240201; -- 1 RECORDS

ALTER TABLE STG_TGT EXCHANGE PARTITION FOR (20240201) WITH TABLE STG_SRC_TMP INCLUDING INDEXES WITHOUT VALIDATION UPDATE GLOBAL INDEXES;

ORA-14702: The partition number is invalid or out-of-range   -- Error
oracle database-partitioning oracle19c
1个回答
0
投票

这似乎是 Oracle 中的一个错误。当你跑步时

ALTER TABLE STG_TGT EXCHANGE PARTITION FOR (20240101) WITH TABLE STG_SRC_TMP INCLUDING INDEXES WITHOUT VALIDATION UPDATE GLOBAL INDEXES;
INSERT INTO STG_TGT (BATCH_DT_ID, NM) VALUES (20240201,'Robert');

然后命令就可以正常工作了。然而

SELECT * 
FROM STG_TGT;

退货

STG_TGT_ID 近乎 BATCH_DT_ID
1 罗伯特 20240201
21 罗伯特 20240201

但是

SELECT * 
FROM STG_TGT 
WHERE BATCH_DT_ID = 20240201;

仅限退货

STG_TGT_ID 近乎 BATCH_DT_ID
21 罗伯特 20240201

SELECT * 
FROM STG_TGT 
WHERE BATCH_DT_ID <> 20240201;

退货

STG_TGT_ID 近乎 BATCH_DT_ID
1 罗伯特 20240201

除非我完全失明,否则这是Oracle中的一个严重错误。您应该在 Oracle 支持处创建票证。

© www.soinside.com 2019 - 2024. All rights reserved.