Oracle的clob

某系统从MySQL转Oracle,用Power Designer反向生成Oracle的DDL脚本,其中MySQL的longtext类型转为CLOB类型。建表顺利,但导入数据时提示字段长度不够,查看CLOB字段显示长度为4000,官网显示CLOB可容纳4G。原来CLOB作为字符串处理最大4000字符,超4000需特别处理,且Navicat不支持超4000的CLOB数据插入。

场景:

  1. 某系统原来使用mysql数据库,需要转成oracle 。 使用power designer 反向,最终生成了oracle 的ddl 脚本。 其中,mysql 不少字段使用了 longtext 类型,被转成了clob 类型 。
    利用生成的oracle的ddl脚本在oracle 10g 中建表,一切顺利。
    问题来了,开始导入原来系统的数据。利用的navicat 数据传输功能,提示字段长度不够。检查是mysql的logtext 类型数据转clob 报的错。

  2. 利用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 而不是具体的字符值。

问题来了

  1. navicat 的数据传输功能不支持超过4000的clob的数据插入。怎么快速导出导入数据呢?(从mysql到oracle)
    apache nifi 是否可以?

https://community.oracle.com/thread/2488783

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值