zoukankan      html  css  js  c++  java
  • ibatis 批量插入oracle总结

    1. 使用批量插入最先想到如下的插入语句

    insert into a (id,name) values('','') ,('','') 但是 oracle 并不支持这种写法 

    然后查询得知可以使用如下写法 

    insert all 

    into a(id,name) values('','') 

    into a(id,name) values('','') (注:可以一次插入一个表也可以多个表)

    但是这种方式有一种限制,就是 行数乘以列数不能大于1000(我没有验证),而且这种方式据说效率不高(我没有验证)

    但是我做批量插入的数据时从别的接口获取的,我无法知道到底有多少数据,而且表的数据库超过50个,所以我舍弃了这种方式,pass.

    继续百度,获知可以使用视图插入,没有行数限制(据说数据最大64k,待项目上线验证),而且效率较高

    如下:

    insert into a (id,name)

    <iterate conjunction="UNION ALL"  property="d">

    select #d[].id#,#d[].name# from dual

    </iterate>

    可以成功,happy..but

    我们用的是oracle ,id 是用序列生成的,简单 ,把id 替换成序列生成就是了

    于是 

    insert into a (id,name)

    <iterate conjunction="UNION ALL"  property="d">

    select SEQ_A.nextval,#d[].name# from dual

    </iterate>

    运行,我去,报错: 此处不允许序号,,什么???

    测试下到底是什么不支持序号,打开plsql 

    insert into a (id,name)

    select SEQ_A.nextval,null from dual 

    没有问题。。。

    然后执行

    select SEQ_A.nextval,null from dual

    union all 

    select SEQ_A.nextval,null from dual

    提示此处不允许序号,,问题找到了,原来是 union all 和 nextval 不能一块用。。。

    百度下原因:

    Restrictions on Sequence Values You cannot use CURRVAL and NEXTVAL in the

    following constructs:
    ■ A subquery in a DELETE, SELECT, or UPDATE statement
    ■ A query of a view or of a materialized view
    ■ A SELECT statement with the DISTINCT operator
    ■ A SELECT statement with a GROUP BY clause or ORDER BY clause   
     A SELECT statement that is combined with another SELECT statement with the
    UNION, INTERSECT, or MINUS set operator
    ■ The WHERE clause of a SELECT statement
    ■ The DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement
    ■ The condition of a CHECK constrain

    参考(连接没法放上去,因为提示内容违禁 http://www.+++ w2bc +++.com/Article/18614, 访问时把加号去掉)

    应该是上面标红的那条导致的,大致意思是 用union 连接的两个select 不能使用序列

    但是我们看到在单个select 是可以使用的,

    select Seq_a.nextval , null from dual 是正确的 。。

    dual 可以是任何表,包括视图,那我们就先把 所有select 用union all 连接后组成一个视图,

    然后使用这个视图查询就可以了。。。

    修改如下

    insert into a (id,name) 

    select SEQ_A.nextval, t. * from (

    <iterate conjunction="UNION ALL"  property="d">

    select #d[].name# from dual

    </iterate>

    ) t 

    正常运行。。。

    同时注意 
    SELECT id,name FROM (select SEQ_B_LOG_ID.NEXTVAL id , 'elong_deo' name from dual);

    这样也是不对的,违反第二条,在被查询的视图中使用序号

    可以改成

    select  SEQ_B_LOG_ID.NEXTVAL id,name from (select 'elong_deo' name from dual);

    3. --- The error occurred while applying a parameter map.
    --- Check the doInsertFlightDynamic-InlineParameterMap.
    --- Check the statement (update failed).
    --- Cause: java.sql.SQLSyntaxErrorException: ORA-01745: 无效的主机/绑定变量名

    sql语句中,两个填充变量间没有写逗号

  • 相关阅读:
    DJANGO入门系列之(模型层:跨表操作)
    DJANGO入门系列之(模型层:单表操作)
    DJANGO入门系列之(模板层)
    DJANGO入门系列之(视图层)
    DJANGO入门系列之(模板层的简单介绍和视图层的扫尾)
    DJANGO入门系列之(虚拟环境的配置与安装)
    Django入门系列之(视图层基本概念)
    DJANGO入门系列之(路由控制)
    DJANGO入门系列之(Django请求生命周期and路由层)
    orm
  • 原文地址:https://www.cnblogs.com/zhangchenglzhao/p/5983569.html
Copyright © 2011-2022 走看看