公司老系统升级,设计到数据库迁移,其中遇到一张流水表EJNL
db2中表结果如下:
TABLE NAME: EUSER.EJNLDATA
COLUMN_NAME DATA_TYPE DATA_LENGTH DATA_PRECISION DATA_SCALE NULLABLE DATA_DEFAULT GENERATED IDENTITY
------------ ------------ ----------- -------------- ---------- -------- ------------ --------- --------
JNLNO INTEGER NO
JNLDATATYPE CHARACTER 1 NO
JNLDATA LONG VARCHAR NO
新库Oracle中的表结构:
Name Type Nullable Default Comments
----------- -------- -------- ------- --------
JNLNO INTEGER
JNLDATATYPE CHAR(1)
JNLDATA LONG RAW
JNLDATA 中的数据是将数据转成字节流后存到数据库中,由于db2的 LONG VARCHAR 比oracle中LONG RAW 存储的位数可以长很多,所以使用plsql工具无法直接将数据导出后直接插到新库中。
百度后找到一种方法:
utl_raw.cast_to_raw()
insert into EJNLDATA(JNLNO,JNLDATATYPE,JNLDATA) values(123456,'A','ZH4sIAAAAAAAAAJWV248aVRzHgWVZlmVpa7VVa4xVWy9xyQzDspBoIrC76W5......');
这样可以将数据修改格式插到表中。
但是效率极低,必须人为的在导出的sql里进行修改,并且这样导致只能100w100w的插入,但是还有个致命问题就是1100W的数据没有任何一个编辑工具可以打开,所以最终只能通过代码来解决,连接两个数据库,然后将其中的一个读出来然后插到另一个库中。
尝试:
1、将db2生成dmp文件,然后oracle导入dmp,但是db2无法生成dmp文件
2、将db2的数据导出到csv,然后写ctl文件,但是依旧受字符长度限制