首页 > 解决方案 > 如何将提取的 ORACLE CLOB 加载到 Postgres 中的仅 1 个 TEXT 列中?

问题描述

我目前正在研究将 CLOB 数据从 ORACLE 迁移到来自外部文件的 Postgres。我在 Postgres 中创建了我的表,我使用的数据类型是 TEXT,它将使用 ORACLE 中的 CLOB 进行复制,现在我只需要输入我的数据。

到目前为止,我所做的是将 ORACLE 中的一个 CLOB 列提取到一个文件中,如下所示,它只是来自 1 个 COLUMN 的 1 个 CLOB,所以我试图将整个 CLOB 的内容加载到 Postgres 中的 1 个列中。

CREATE TABLE clob_test (
id number,
clob_col CLOB);

DECLARE
c CLOB;
CURSOR scur IS
SELECT text
FROM dba_source
WHERE rownum < 200001;
BEGIN
EXECUTE IMMEDIATE 'truncate table clob_test';
FOR srec IN scur LOOP
c := c || srec.text;
END LOOP;
INSERT INTO clob_test VALUES (1, c);
COMMIT;
END;
/

DECLARE
buf CLOB;
BEGIN
SELECT clob_col
INTO buf
FROM clob_test
WHERE id = 1;
dbms_advisor.create_file(buf, 'TEST_DIR', 'clob_1.txt');
END;
/

这可以正常工作并生成包含 ORACLE CLOB 列 CLOB_COL 的所有内容的 clob_1.txt 文件。下面是文件输出的一个例子,它似乎包含了你能想到的每一个可能的字符,包括“~”......


/********** Types and subtypes, do not reorder **********/
type BOOLEAN is (FALSE, TRUE);
type DATE is DATE_BASE;
type NUMBER is NUMBER_BASE;
subtype FLOAT is NUMBER; -- NUMBER(126)
subtype REAL is FLOAT; -- FLOAT(63)
...
...
...
END;
/

我现在的问题是如何将这 1 个文件的全部内容放入 Postgres 中的 1 条记录中,以便准确模拟数据最初是如何存储在 ORACLE 中的 1 条记录中的?

实际上,我想要实现的目标与此类似,它可以工作,但格式很糟糕,并不能真正反映数据最初的存储方式。

POSTGRES> insert into clob_test select pg_read_file('/home/oracle/clob_1.txt');

我曾尝试使用 COPY 命令,但遇到了 2 个问题。首先,如果有回车,它会将其视为另一条记录并将文件拆分,第二个问题是我找不到文件中未使用的分隔符。有什么方法可以绕过分隔符,只是告诉 Postgres 从这个文件中复制所有内容而不使用分隔符,因为它只有 1 列?

任何帮助都会很棒

标签: oraclepostgresqlclobcsv-importpostgresql-copy

解决方案


其他回答者注意:这是不完整的,仍然会将数据放入多个记录中;该问题还需要单个字段中的所有数据。

使用COPY ... FROM ... CSV DELIMITER e'\x01' QUOTE e'\x02'. 唯一无法处理的是实际的二进制 blob,据我了解,CLOB 中不允许使用(我自己从未使用过 Oracle)。这只避免了分隔符问题;它仍会将数据插入每行输入的一行。

我不确定如何解决该问题,但您应该知道,在所有情况下都可能无法正确执行此操作。PG 支持的最大字段值是 1GB,而 CLOB 最大支持 4GB。如果需要正确导入 >1GB 的 CLOB,唯一可用的路径是 PG 的大对象接口


推荐阅读