java

    本次在提供一个关于解决批量导入由于数据量过多,会报出参数过多,我们应该清楚一个问题,sqlserver导入数据时,允许的最大sql长度是3000个字符,但当我们数据过多,及时是使用batch结合事务处理已然会爆掉,实际上我们还可以用另一种方式,将文件生成到数据库所在的服务器上,然后通过数据库本身的备份恢复机制将数据导入到db中,下面是具体操作代码

我们偶尔会有将数据从SQL
SERVER导入到ORACLE当中的这种需求,那么这种跨数据库导数有那些方法呢?这些方法又有那些利弊呢?
下面比较肤浅的总结了一些可行的方法。

    环境:spring boot-maven-mybatis-sqlserver-tomcat

1:生成SQL脚本然后去ORACLE数据库执行。

一、在service实现中创建含有导入数据的文件

@Service
public class DemoServiceImpl extends ServiceImpl<DemoMapper, Demo> implements DemoService {

    @Resource
    private DemoMapper dmapper;

    @Override
    public void insertDemo(List<Demo> demoList) throws Exception {
        if(ToolUtil.isNotEmpty(demoList)) {
            try{
                //生成存储过程TXT start
                Demo demo = new Demo();
                Demo testDemo = null;
                String filename = "D:/"+demoList.get(0).getFileId()+"demoFileName.txt";
                File newFile = new File(filename);
                StringBuffer sb = new StringBuffer();
                for(int i=0;i<demoList.size();i++){
                    testDemo = demoList.get(i);
                    ToolUtil.copyProperties(testDemo, demo);
                    sb.append(StringUtil.null2String(demo.filed1())).append(",");
                    sb.append(StringUtil.null2String(demo.filed2())).append(",");
                    sb.append(StringUtil.null2String(demo.filed3())).append("*");
                }
                Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(newFile), "UTF-8"));
                writer.write(sb.toString());
                writer.flush();
                writer.close();
                //生成存储过程TXT End

                //调用存储过程
                dmapper.insertTxt(filename,"demoFileName");

            } catch (Exception e) {
                throw e;
            } 
        }

    }

}

二、工具类

public class StringUtil {

    /**
     * null或""转换String ""
     * 
     * */
    public static String null2String(String str){
        if(str==null||"".equals(str)) {
            return "";
        }
        return str;
    }

}



三、dao.xml中加入调用读取文件的sql

<select id="insertTxt">
        exec dbo.txt_insert @filename =#{filename},@tablename = #{tablename}
    </select>

四、执行导入的slq语句

ALTER procedure [dbo].[txt_insert]
@filename nvarchar(100),
@tablename nvarchar(100)

AS  
exec('  
bulk insert ' + @tablename + ' from ''' + @filename + '''  
WITH  

      (  

        FIELDTERMINATOR = '','',--列分割符  

        ROWTERMINATOR = ''*'',--行分割符  

  FIRSTROW = 1  ,  --指定要加载的第一行的行号。默认值是指定数据文件中的第一行  
  CHECK_CONSTRAINTS  

      );')
CREATE TABLE TEST

(

 

    ID   INT ,

 

    NAME VARCHAR(12)

 

)

 

INSERT INTO dbo.TEST

 

SELECT 1001, 'Kerry' UNION ALL

 

SELECT 1002, 'Jimmy' UNION ALL

 

SELECT 1003, 'Ken'   UNION ALL

 

SELECT 1004, 'Richard'

 

SELECT 'INSERT INTO TEST '

 

      +'SELECT ' + CAST(ID AS VARCHAR(12)) +' AS ID,'''

 

      + NAME + ''' FROM DUAL;'

 

FROM dbo.TEST

————————————-大数据量导入方案—————————–

 

———————————有好的建议可以直接在评论中提出,大家一起讨论—————–

优点:我还真找不出其优点,仅仅作为一种方法归纳在此。

缺点:操作麻烦,每次操作都要写脚本;数据量大时性能非常糟糕。

适用场景:仅仅使用小表、基础数据表。例如省份表之类。它能做到的,SQL
SERVER导入导出工具能比其跟方便、快捷的做到。

 

2:创建链接服务器链接到ORACLE数据库

 

澳门新葡亰,  
创建链接到ORACLE数据库的链接服务器非常简单,在此不做过多描述。一般使用这种方式做数据交互的情况较多。

 

优点:链接服务器创建好后,可以非常方便的使用SQL导入数据到ORACLE。而且可以反复使用。

缺点:需要安装ORACLE CLIENT客户端,而且ORACLE
CLIENT客户端工具安装后必须重启服务器使之生效。效率不是最快的。尤其当导入的数据量非常大时,不推荐使用这种方法。

适用场景:适用于系统经常需要在SQL
SERVER与ORACLE之间数据交互的场景,这样就可以方便的利用它来导数,而不用为了导数在服务器上装ORACLE
CLIENT客户端工具。尤其适合经常需要数据交互的场景。

 

网站地图xml地图