oracle - 如何将提取的 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 列?
任何帮助都会很棒
解决方案
其他回答者注意:这是不完整的,仍然会将数据放入多个记录中;该问题还需要单个字段中的所有数据。
使用COPY ... FROM ... CSV DELIMITER e'\x01' QUOTE e'\x02'
. 唯一无法处理的是实际的二进制 blob,据我了解,CLOB 中不允许使用(我自己从未使用过 Oracle)。这只避免了分隔符问题;它仍会将数据插入每行输入的一行。
我不确定如何解决该问题,但您应该知道,在所有情况下都可能无法正确执行此操作。PG 支持的最大字段值是 1GB,而 CLOB 最大支持 4GB。如果需要正确导入 >1GB 的 CLOB,唯一可用的路径是 PG 的大对象接口。
推荐阅读
- c++ - FFF(Fake Function Framework)重新声明为不同类型的实体
- artifactory - 无法从 Jfrog Artifactory 读取
- testing - 酶集成测试:axios.get 调用未在 redux-saga 中执行
- java - 如何从 1 开始 for 循环
- java - 在 JFrame 表单中使用方法 (GUI - Java)
- python - 与 sys.path 顺序无关的与 SDK 包导入同名的 python 站点包
- python - Python Tifffile:在 SageMaker 中加载图像的问题
- python - redis python3 rq worker因utcparse started_at date缺席而失败
- mysql - 如何修复 unregonize 语句类型错误?
- python - Matplotlib savefig() OSError: [Errno 30] 只读文件系统:'image.png'