一个分页查询存储过程:NBPT_PROCEDURE_PAGING,
第一个参数是一个SQL语句,这个sql语句是动态生成的,但是这里调用时,如果动态生成的话,参数会直接传给存储过程,从而报索引超出范围的错误
<select id="callProcedurePaging" statementType="CALLABLE" parameterType="java.util.HashMap" resultMap="dicdataMap" flushCache="true">
{call dbo.NBPT_PROCEDURE_PAGING(
'
SELECT
<include refid="Base_Column_List" />
FROM
<include refid="Table_Name" />
<include refid="Select_Condition" />
'
,
#{SEARCH_PAGE},#{PAGE_COUNT},#{SEARCH_ORDER},#{COUNTALL,mode=OUT, jdbcType=INTEGER})}
</select>
下面是动态参数部分的部分截取
<sql id="Select_Condition">
where 1=1
<if test="record.uuid != null and record.uuid != ''">
AND NBPT_DICDATA_UUID = #{record.uuid}
</if>
<if test="record.sort != null and record.sort != ''">
AND NBPT_DICDATA_SORT = #{record.sort}
</if>
<if test="record.label != null and record.label != ''">
AND NBPT_DICDATA_LABEL = #{record.label}
</if>
</sql>
报错提示: 索引 5 超出范围。
最终报错的地方在这里,NBPT_DICDATA_TYPE = ? ' , ?,?,?,?),这里有5个问号,因为Select_Condition接收了参数,现在已经测试的结果是,如果这个参数为""或者null的话,也就是Select_Condition只剩下where 1=1 就不会报错
问题追加:
现测试将动态条件改为固定条件
即传入参数为'SELECT * FROM NBPT_DICDATA WHERE 1=1 AND NBPT_DICDATA_TYPE = ''sys_user_sex''',可以查询到结果,于是将条件生成改为了如下
<if test="record.type != null and record.type != ''">
AND NBPT_DICDATA_TYPE =''${record.type}''
</if>
结果报错如下:Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 'sys_user_sex' 附近有语法错误。