第一种解决思路:使用存储过程批量生成序列并返回集合。
存储过程:
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>