如何将提取的 ORACLE CLOB 加载到 Postgres 中的 1 个 TEXT 列中?

问题描述

我目前正在考虑从外部文件将 CLOB 数据从 ORACLE 迁移到 Postgres。我已经在 Postgres 中创建了我的表,我使用的数据类型是 TEXT,它将使用 ORACLE 中的 CLOB 进行复制,现在我只需要获取我的数据。

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

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 列?

任何帮助都会很棒?

解决方法

其他答主注意:这个是不完整的,还是会把数据放到多条记录中;该问题还需要单个字段中的所有数据。

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

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