zoukankan      html  css  js  c++  java
  • sql中的text字段如何导入oracle

    这一段时间在把SQLSERVER迁移到ORASCLE,中间遇到了一系列的问题,通过查找资料和想办法,已经基本顺利解决,后面我会针对两个数据库迁移过程中我遇到的问题,整理汇总成一个个小问题,带着实例编码,给自己留个备份也同时对遇到类似问题的人做个参考。

    这是第一个问题:关于sql server中的text字段如何导入的问题

    在sql和oracle中,大字段的处理其实都不是很简单,在sql中有text、ntext、binary等,2005后新增加了varchar(max)和nvarchar(max),后面增加的这两个用起来非常爽,下面会提到;oracle中的blob、clob、nclob、nblob等类型。

    下面的例子数据量不多,只有几千条数据,但是没有办法通过常规的方式进行处理,下面先说明下我尝试的过程。

    1.使用常规方式,我基本采用toad的import table data的方式,具体使用很简单在database --import中,这种方式的好处是图形化操作,不用做字段的手工匹配,缺点是效率比较低,但是在数据量几万以下可以采用这种方式进行导入,比较方便。

    我通过查询出的数据复制、粘贴到excel中,假死。

    2.一个字段一个字段粘贴,对1000多条的text字段操作,8G内存的机器也会在执行很长时间后,excel进程假死,不知道这算不算微软的bug反正这样的方式是走不通了。

    3.我通过导出txt文本的方式,数据是导出了,但是在导入的时候,toad界面中的列全乱了,无法操作。

    4.sql developer的text importer手工做字段匹配,也不行。

    说了这么多说下最后的方式吧。

    ========================================================
    /*关于表中存在text字段的导入oracle
    1.首先在sql原表中增加autoid自增字段唯一标识记录
    2.替换text字段中的特殊字符(换行、回车、制表、逗号、单引号等)
    3.先用常规方法导出非text字段然后导入(带着autoid)
    4.分别导出各自的text字段,有几个text字段导出几个文件(带着autoid),并
    把这些text字段导入临时处理的对应的临时表(需要在oracle中提前建立)
    5.在oracle中通过更新的方式用autoid做关联标识进行数据更新
    6.把特殊字符替换回字段并删除autoid
    */
    ----------------------sqlserver处理部分---------------------
    --1.sql add autoid
    alter table FORMLAYOUT add autoid int identity(1,1)


    --2.export base column
    select autoid,formid,nodeid,typeid,layoutname,isdefault,isdelete
     from dbo.FORMLAYOUT
     order by autoid


    --3.repalce text info
    --replace char(10) char(13)char(9)换行 回车 制表符tab
    update formlayout
    set LAYOUTINFO=REPLACE(LAYOUTINFO,CHAR(10),'**^^')
    update formlayout
    set LAYOUTINFO=REPLACE(LAYOUTINFO,CHAR(13),'^^**')
    update formlayout
    set LAYOUTINFO=REPLACE(LAYOUTINFO,',',',')
    update formlayout
    set LAYOUTINFO=REPLACE(LAYOUTINFO,CHAR(9),'^^^^')

    update formlayout
    set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,CHAR(10),'**^^')
    update formlayout
    set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,CHAR(13),'^^**')
    update formlayout
    set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,',',',')
    update formlayout
    set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,CHAR(9),'^^^^')
     
    --4.export text1 column
    select autoid,LAYOUTINFO
     from dbo.FORMLAYOUT
     order by autoid
    --5.export text1 column
    select autoid,LAYOUTFORMATTED
     from dbo.FORMLAYOUT
     order by autoid

    ----------------------oracle处理部分---------------------
    --1.建立主表
    CREATE TABLE "FORMLAYOUT" (
    "AUTOID" number(4),
    "ID" NVARCHAR2(32) NOT NULL,
    "FORMID" NVARCHAR2(32),
    "NODEID" NVARCHAR2(32),
    "TYPEID" NUMBER(38),
    "LAYOUTNAME" NVARCHAR2(256),
    "ISDEFAULT" NUMBER(38),
    "ISDELETE" NUMBER(38)
    );
    --2.建立临时处理的表
    CREATE TABLE "TMP1" (
    "AUTOID" number(4) not null,
    "LAYOUTINFO" NCLOB
    );

    CREATE TABLE "TMP2" (
    "AUTOID" number(4) not null,
    "LAYOUTFORMATTED" NCLOB
    );
    --3.通过toad导入
    --4.主表创建字段并通过关联更新
    alter table FORMLAYOUT add LAYOUTINFO NCLOB;
    alter table FORMLAYOUT add LAYOUTFORMATTED NCLOB;
    UPDATE FORMLAYOUT
    SET FORMLAYOUT.LAYOUTINFO=(SELECT TMP1.LAYOUTINFO FROM TMP1 WHERE TMP1.AUTOID=FORMLAYOUT.AUTOID) ;

    UPDATE FORMLAYOUT
    SET FORMLAYOUT.LAYOUTFORMATTED=(SELECT TMP2.LAYOUTFORMATTED FROM TMP2 WHERE TMP2.AUTOID=FORMLAYOUT.AUTOID) ;
    --5.检查数据
    --6.替换回特殊字符,注意sql和oracle关于字符的差异一个是char一个是chr
    update FORMLAYOUT
    set LAYOUTINFO=REPLACE(LAYOUTINFO,'**^^',chr(10));
    update FORMLAYOUT
    set LAYOUTINFO=REPLACE(LAYOUTINFO,'^^**',chr(13));
    update formlayout
    set LAYOUTINFO=REPLACE(LAYOUTINFO,',',',');
    update formlayout
    set LAYOUTINFO=REPLACE(LAYOUTINFO,'^^^^',chr(9));

    update FORMLAYOUT
    set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,'**^^',chr(10));
    update FORMLAYOUT
    set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,'^^**',chr(13));
    update formlayout
    set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,',',',');
    update formlayout
    set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,'^^^^',chr(9));
    --7.删除多余表和列
    alter table FORMLAYOUT drop column AUTOID;

    drop table "TMP1";
    drop table "TMP2";

    select * from FORMLAYOUT;

  • 相关阅读:
    LeetCode 227. Basic Calculator II
    LeetCode 224. Basic Calculator
    LeetCode 103. Binary Tree Zigzag Level Order Traversal
    LeetCode 102. Binary Tree Level Order Traversal
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode 169. Majority Element
    LeetCode 145. Binary Tree Postorder Traversal
    LeetCode 94. Binary Tree Inorder Traversal
    LeetCode 144. Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/tippoint/p/2744539.html
Copyright © 2011-2022 走看看