ibatis 配置调用存储过程,jdbctype配置
?
数据库存储过程如下:
procedure p_project_details_stat
(
i_date_start in varchar2,
i_date_end in varchar2,
i_range_start in number,
i_range_end in number,
i_org_id in number,
i_species_id IN VARCHAR2,
i_query_user_id in number,
o_report_id out number
)
配置调用如下:
<parameterMap id="proMap" javaType="java.lang.String" mode="IN" jdbcType="VARCHAR" />
<parameter property="complainDateEnd" javaType="java.lang.String" mode="IN" jdbcType="VARCHAR" />
<parameter property="priceOne" javaType="java.math.BigDecimal" mode="IN" jdbcType="NUMBER" />
<parameter property="priceTwo" javaType="java.math.BigDecimal" mode="IN" jdbcType="NUMBER" />
<parameter property="orgId" javaType="java.math.BigDecimal" mode="IN" jdbcType="NUMBER" />
<parameter property="speciesIdList" javaType="java.lang.String" mode="IN" jdbcType="VARCHAR" />
<parameter property="userId" javaType="java.math.BigDecimal" mode="IN" jdbcType="NUMBER" />
<parameter property="reportId" javaType="java.math.BigDecimal" mode="OUT" jdbcType="NUMBER" />
</parameterMap>
<procedure id="generateProjectDetial" parameterMap="proMap">
<![CDATA[
CALL szzc_stat.p_project_details_stat(?,?,?,?,?,?,?,?)
]]>
</procedure>
?
老是报:
--- Check the CALL szzc_stat.p_project_details_stat(?,?,?,?,?,?,?,?).
--- Check the output parameters (register output parameters failed).
--- Cause: java.sql.SQLException: 无效的列类型: -99999999
?
网上查找资料:
?
后来查看java.sql.Types类中有关JDBC类型变量类型,并没有发“NUMBER”这一静态字段,而只有“NUMERIC”字段。(因此 jdbcType 的值不是数据库ORACLE的参数类型,而是其对应的JDBC变量类型)
但改了之后依然报同样错误。
后来发现在java.sql.Types类中还有一个DECIMAL静态常量,与javaType定义的java.math.BigDecimal类型一致。
再修改测试则通过,不再报错。
所以“无效的列类型”异常解决方法,根据存储过程的参数类型找出正确的jdbcType(具体参考java.sql.Types类的JDBC静态变量)。
?
?
地址:http://www.cnblogs.com/leolwang/archive/2010/03/25/1694539.html
?
?
正确配置:
<parameterMap id="proMap" javaType="java.lang.String" mode="IN" jdbcType="VARCHAR" />
<parameter property="complainDateEnd" javaType="java.lang.String" mode="IN" jdbcType="VARCHAR" />
<parameter property="priceOne" javaType="java.math.BigDecimal" mode="IN" jdbcType="DECIMAL" />
<parameter property="priceTwo" javaType="java.math.BigDecimal" mode="IN" jdbcType="DECIMAL" />
<parameter property="orgId" javaType="java.math.BigDecimal" mode="IN" jdbcType="DECIMAL" />
<parameter property="speciesIdList" javaType="java.lang.String" mode="IN" jdbcType="VARCHAR" />
<parameter property="userId" javaType="java.math.BigDecimal" mode="IN" jdbcType="DECIMAL" />
<parameter property="reportId" javaType="java.math.BigDecimal" mode="OUT" jdbcType="DECIMAL" />
</parameterMap>
<procedure id="generateProjectDetial" parameterMap="proMap">
<![CDATA[
CALL szzc_stat.p_project_details_stat(?,?,?,?,?,?,?,?)
]]>
</procedure>
jdbcType类型:
?
?
数据库类型与JDBC TYPE 和Java类型对应关系
SQL Datatypes
JDBC Typecodes
Standard Java Types
Java取值范围
NUMBER
java.sql.Types.NUMERIC
java.math.BigDecimal
无限制
NUMBER
java.sql.Types.DECIMAL
java.math.BigDecimal
无限制
NUMBER
java.sql.Types.BIT
boolean
true,false
NUMBER
java.sql.Types.TINYINT
byte
from –128 to 127
NUMBER
java.sql.Types.SMALLINT
short
from –32768 to 32767
NUMBER
java.sql.Types.INTEGER
int
From –2147483648 to 2147483647
NUMBER
java.sql.Types.BIGINT
long
From –9223372036854775808 to 9223372036854775807
NUMBER
java.sql.Types.REAL
float
From 1.4E-45
To 3.4028235E38
NUMBER
java.sql.Types.FLOAT
double
From 4.9E-324 to
1.7976931348623157E308
NUMBER
java.sql.Types.DOUBLE
double