场景:
-
某系统原来使用mysql数据库,需要转成oracle 。 使用power designer 反向,最终生成了oracle 的ddl 脚本。 其中,mysql 不少字段使用了 longtext 类型,被转成了clob 类型 。
利用生成的oracle的ddl脚本在oracle 10g 中建表,一切顺利。
问题来了,开始导入原来系统的数据。利用的navicat 数据传输功能,提示字段长度不够。检查是mysql的logtext 类型数据转clob 报的错。 -
利用navicat 和 DBeaver 查看该clob字段显示长度均为4000 而根据相关资料clob字段应该是可以容纳4G 长度的。 修改字段长度值大于4000 直接报错。
问题解决
最终,根据官网社区的一个帖子,发现。clob 字段作为字符串处理跟varchar2没有差别最大只能是4000个字符。(oracle 完全是个坑)。要查询,插入超过4000个字符需要特别处理。
以下例子:
-- 以下字面看,插入了6000个字符到NEWTALE1的1字段。 但如果类型为clob 则只能存储4000个字符串,其他字符被截断。 同时还不报任何错误。(oracle大坑多多)
INSERT INTO NEWTABLE1 VALUES ( LPAD('*' , 6000, '*')) ;
SELECT DBMS_LOB.GETLENGTH(COLUMN1) FROM NEWTABLE1 -- 结果是4000
要真正插入超过4000的字符,使用以下方式。
declare
c clob := EMPTY_CLOB();
begin
dbms_lob.createTemporary(c,true);
dbms_lob.append(c, LPAD('*',14000,'*'));
insert into NEWTABLE1(COLUMN1) values(c);
dbms_lob.freetemporary( c );
end;
SELECT DBMS_LOB.GETLENGTH(COLUMN1) FROM NEWTABLE1 -- 结果是14000,同时工具DBeaver显示CLOB 而不是具体的字符值。
问题来了
- navicat 的数据传输功能不支持超过4000的clob的数据插入。怎么快速导出导入数据呢?(从mysql到oracle)
apache nifi 是否可以?
某系统从MySQL转Oracle,用Power Designer反向生成Oracle的DDL脚本,其中MySQL的longtext类型转为CLOB类型。建表顺利,但导入数据时提示字段长度不够,查看CLOB字段显示长度为4000,官网显示CLOB可容纳4G。原来CLOB作为字符串处理最大4000字符,超4000需特别处理,且Navicat不支持超4000的CLOB数据插入。

340

被折叠的 条评论
为什么被折叠?



