ibatis批量新增-自增长序列

本文介绍了在数据库中批量生成序列的两种方法:一种是通过存储过程实现,虽然有效但需额外使用临时表;另一种推荐使用的方法是利用CONNECT BY进行循环查询,更为高效便捷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种解决思路:使用存储过程批量生成序列并返回集合。

存储过程:

CREATE OR REPLACE PROCEDURE proce_seq(V_SEQ IN VARCHAR2,
                                   NUM   IN INTEGER,
                                   P_CUR OUT SYS_REFCURSOR) AS
                                   
 /*********************************************************************
   名称: proce_seq
   功能描述: 获取制定序列集合
   创建人: 张驰
   处理逻辑:传入序列名称和所需数量返回序列集合
   修改记录:
   创建日期: 2015-11-10
   备注:
  **********************************************************************/
                                   
  V_SQL VARCHAR2(500);
  I    NUMBER;
BEGIN
 EXECUTE immediate 'truncate table  T_SEQ_TEMP';
  FOR I IN 1 .. NUM LOOP
    V_SQL := 'INSERT INTO T_SEQ_TEMP SELECT ' || V_SEQ || '.nextval from dual';
    EXECUTE IMMEDIATE V_SQL;
	COMMIT;
  END LOOP;
  OPEN P_CUR FOR
    SELECT * FROM T_SEQ_TEMP;
END proce_seq;

ibatis调用存储过程:

  <parameterMap id="hasAuthParam" class="java.util.HashMap" >  
    <parameter property="V_SEQ" jdbcType="VARCHAR" mode="IN"/>  
    <parameter property="NUM" jdbcType="INTEGER"  mode="IN"/>  
    <parameter property="P_CUR" jdbcType="ORACLECURSOR"  
            javaType="java.sql.ResultSet" mode="OUT"/>
  </parameterMap>  
  

  <procedure id="callSeqList" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
  	{ call PROCE_SEQ(?,?,?)}
  </procedure>

这种方式需动态的把序列名称和所要获取的序列数量传给存储过程,然后已游标的形式返回结果集。但是这种方式有一个致命的确定就是再存储过程执行中需要向临时表中存放序列,这要再数据模型上会多出一张临时表同事会执行commit动作。一旦commit,那么在我们的Java代码里对事物的控制就会受到影响    

第二种解决思路:使用 CONNECT BY循环(推荐使用)。

StringBuffer sql = new StringBuffer();
sql.append("select ").append(seqName).append(".NEXTVAL AS SEQ FROM DUAL CONNECT BY ROWNUM <= ").append(number);
map.put("PROCE_SEQ", sql);
List<Map<String,Object>> mapList =  this.getDao().find("OtherEntity.callSeqList", map);
 <select id="callSeqList" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
  	<![CDATA[ $PROCE_SEQ$ ]]>
  </select>

 

转载于:https://my.oschina.net/zhangshuge/blog/635245

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值