zoukankan      html  css  js  c++  java
  • Oracle 批量插入数据 insert all into 用法

    项目需要用到导入excel表,并解析数据批量插入到oracle数据库中。

    1)直接解析excel,循环行,拼了sql,executeUpdate。

    执行一波…
    咦,这效率很低啊,有多少行数据就执行了多少句sql,基本是一万行已经接近一分钟了。

    2)每次都仅执行一条sql语句,时间是不是都花在建立连接放开连接balabala的过程上了,用executebatch批量执行sql语句试试。
    没有任何明显的改善。

    3)那改成一条insert语句效果怎么样呢?

    å¨è¿éæå¥å¾çæè¿°

    å¨è¿éæå¥å¾çæè¿°

    这回效果看起来很明显了,问题看起来要解决了,确实,按这样改到程序里,执行上传excel,解析插入一万行数据到数据库,总共也就差不多一秒钟,能接受了。

    4)但是我还想兼容Oracle,刚才是拿MySql做的实验,Oracle竟然不能这么写:

    1. insert into testimport(username,password,address,telphone,email)
    2. values
    3. ('testname','jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd','XXX省XXX市','19876767856','fdsfdsfads@163.com'),
    4. ('testname','jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd','XXX省XXX市','19876767856','fdsfdsfads@164.com'),
    5. ('testname','jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd','XXX省XXX市','19876767856','fdsfdsfads@165.com')

    那我们在Oracle中,怎么通过一个insert语句批量插入数据呢?

    1.  INSERT ALL 
    2.  INTO A(field_1,field_2) VALUES (value_1,value_2) 
    3.  INTO A(field_1,field_2) VALUES (value_3,value_4) 
    4.  INTO A(field_1,field_2) VALUES (value_5,value_6)
    5.  SELECT 1 FROM DUAL;

    补充:评论里提到的为什么要加 SELECT 1 FROM DUAL?
    官方例子:

    1.  INSERT ALL
    2.  INTO sales (prod_id, cust_id, time_id, amount)
    3. VALUES (product_id, customer_id, weekly_start_date, sales_sun)
    4. INTO sales (prod_id, cust_id, time_id, amount)
    5.  VALUES (product_id, customer_id, weekly_start_date+1, sales_mon)
    6. INTO sales (prod_id, cust_id, time_id, amount)
    7.  VALUES (product_id, customer_id, weekly_start_date+2, sales_tue)
    8.  INTO sales (prod_id, cust_id, time_id, amount)
    9.    。。。
    10. SELECT product_id, customer_id, weekly_start_date, sales_sun,
    11.  sales_mon, sales_tue, sales_wed, sales_thu, sales_fri, sales_sat
    12.  FROM sales_input_table;

    个人理解:

    “ALL into_clause: Specify ALL followed by multiple insert_into_clauses to perform an unconditional multitable insert. Oracle Database executes each insert_into_clause once for each row returned by the subquery.”

    insert all into并不表示一个表中插入多条记录,而是表示多表插入各一条记录,而这多表可以是同一个表,就成了单表插入多条记录。根据后面子查询的结果,前面每条into语句执行一次,博客正文中value都是“字面量”,所以用select 1 from dual返回一条记录即可。

    参考地址:https://docs.oracle.com/database/121/SQLRF/statements_9015.htm#SQLRF01604

    补充:

    oracle问题:

    SELECT 1 from dual的作用?

    回答:

    ①. 这是oracle中自带的一个虚拟表,用它来可以查看一些系统信息;比如系统时间 :select sysdate from dual;

    ②. dual是虚拟表,这句话的意思就是返回一个值,这里的值就是1

    原文来自于:https://blog.csdn.net/AlbenXie/article/details/103383631

  • 相关阅读:
    Hadoop HDFS的常用命令
    Spark简介
    Hadoop datanode无法启动的错误
    kafka在虚拟机环境的优化
    kafka的安装和使用
    Strom的安装及使用
    机器学习
    Tomcat启动时为什么要配置CATALINA_HOME环境变量??
    sqoop的安装和使用
    Python Lambda 的简单用法
  • 原文地址:https://www.cnblogs.com/xiong950413/p/14743656.html
Copyright © 2011-2022 走看看