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;

  • 相关阅读:
    谈谈Windows Wow64
    Windows x86 下的 静态代码混淆
    Android so 文件进阶<二> 从dlsym()源码看android 动态链接过程
    You should blog even if you have no readers
    android app启动过程
    Android so文件进阶 <一>
    AndroidStudio+ideasmali动态调试smali汇编
    32位进程注入64位进程
    What is Windows Clustering
    Delphi实用小function
  • 原文地址:https://www.cnblogs.com/tippoint/p/2744539.html
Copyright © 2011-2022 走看看