ibatis调用oracle存储过程,参数类型INOUT

今天在用ibatis调用oracle存储过程时出现了个奇怪的问题,先把代码贴上来。
此处为存储过程
CREATE OR REPLACE PROCEDURE test(
p_userName in varchar2,
p_age in number,
p_res in out varchar2
)
as
i_count number;
--i_age number;
begin
--此处先判断此用户存在不,存在的话在执行删除操作
--注意 :此处如果用了count函数,呢么这个地方就只能给一个变量赋值
--如果写成 select count(username),age into i_count,i_age from ....
--会报错,不用函数的话可以给多个变量赋值 (这个地方是自己遇到了就写了出来)
--其实应该用oracle默认游标的
select count(username) into i_count from userinfo where username=p_username;
--if SQL%NOTFOUND then
-- p_res := '-2';
--return;
--end if;
if(0 <> i_count)then
insert into userinfo(username,age) values(p_username,p_age);
commit;
p_res := '0';
else
p_res := '-2';--用户名已存在
end if;
exception
when others then
p_res := '-1'; --数据库错误
rollback;
end test;

此处sqlMap的配置文件
<sqlMap>
<parameterMap id="test" class="java.util.HashMap">
<parameter property="userName" jdbcType="varchar2" javaType="java.lang.String" />
<parameter property="age" jdbcType="int" javaType="java.lang.Integer" />
<parameter property="res" jdbcType="varchar2" javaType="java.lang.Integer"
mode="INOUT" />
</parameterMap>
<procedure id="testPro" parameterMap="test">
{call puc_test(?,?)}
</procedure>
</sqlMap>

在执行存储过程时报无效的列类型,regist output parameter is failed,找了半天原因也没找到,发现把
<parameter property="res" jdbcType="varchar2" javaType="java.lang.Integer"
mode="INOUT" />
此处mode="INOUT" 换成mode="IN"就没问题,百思不得其解,最后在偶然的机会发现原来如果mode="INOUT" 如果jdbdType用varchar2时必须写成大写的VARCHAR(不能加2,不能小写),真是奇怪的问题.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值