我正在尝试在两个分区表之间移动数据。下面是示例脚本。我正在研究 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 中的一个错误。当你跑步时
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 支持处创建票证。