首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

用HIBERNATE提取游标调用存储过程有关问题

2012-12-18 
用HIBERNATE提取游标调用存储过程问题本帖最后由 qiyewutingxue 于 2012-11-08 18:25:36 编辑我知道怎么在

用HIBERNATE提取游标调用存储过程问题
本帖最后由 qiyewutingxue 于 2012-11-08 18:25:36 编辑 我知道怎么在JAVA项目里用HIBERNATE调用
 oracle数据库里输出参数类型为整张表对象的游标的存储过程,以下是存储过程和项目里的映射
 -- 查询用户列表的过程
 create or replace procedure proc_userList
 (
   c_user out sys_refcursor
 )
 as
  
 begin
   open c_user for select * from users;
 end;
 
映射文件User.hbm.xml
 <sql-query name="userList" callable="true">
      {call proc_userList(?)}
 <return alias="user" class="entity.User" >

 </return>
     </sql-query>
 
如果我只想查询users表的某些列呢 在存储过程的输出参数返回类型那里要怎么改
 映射文件里又该怎么改呢
 



还有下面是一个添加的存储过程我想把存储过程中的v_str变量转为游标返回然后在项目里HIBERNATE调用
 
怎么实现呢??还有映射文件里要怎么写??--不知道这么想对不对。或者有更简单的方法。
 

-- 添加用户的过程
 create or replace procedure proc_userAdd
 (
   v_yz out sys_refcursor; --定义输出参数类型为游标类型
    v_name varchar2,
    v_password varchar2,
    v_telephone varchar2,
    v_username varchar2,
    v_isadmin char
 )as 
 v_name_check number;
 v_c exception;
 v_str nvarchar2(50);
 begin
   v_name_check=users_cx(v_name);--接收验证用户是否存在的函数返回值 函数在 代码最下面
   if v_name_check>0 then
     raise v_c;
   else  
     insert into users values(seq_user.nextval, v_name, v_password, v_telephone, v_username, v_isadmin);
     v_str:='添加成功';
   end if;
   exception
   when v_c then
   v_str:='添加失败';
   --怎么将v_str转换为游标然后赋给输出参数v_yz呢 
 end;
 
验证用户是否存在的函数
 create or replace function users_cx
 (
 name users.name%type
 )return number as users_count number;
 begin
 select count(*) into users_count from users where name=name;
 return users_count;
 end;

[最优解释]

还是老师给力啊
[其他解释]

别沉啊
[其他解释]

DOU 几天了 一个回复都没 真纠结
[其他解释]
第一个问题:查询定义中把<return>去掉,换成<return-scalar>
<sql-query name="userList" callable="true">
      {call proc_userList(?)}
      <return-scalar column="id" type="java.lang.Integer"/>
      <return-scalar column="name" type="java.lang.String"/>
</sql-query>

<return>默认填充实体的所有属性,如果查询返回的字段不够,就会报“列名无效”异常。
<return-scalar>是单独定义需要返回的结果值,每个值对应一个列。【注意:Query返回的不再是实体对象的集合,而是包含Object[]的集合】


第二个问题:输出参数的值在方法中需要通过查询返回
create or replace procedure proc_userAdd
 (
    v_yz out sys_refcursor; --定义输出参数类型为游标类型


    v_name varchar2,
    v_password varchar2,
    v_telephone varchar2,
    v_username varchar2,
    v_isadmin char
 )as 
 v_name_check number;
 v_c exception;
 v_str nvarchar2(50);
 begin
   v_name_check=users_cx(v_name);--接收验证用户是否存在的函数返回值 函数在 代码最下面
   if v_name_check>0 then
     raise v_c;
   else  
     insert into users values(seq_user.nextval, v_name, v_password, v_telephone, v_username, v_isadmin);
     v_str:='添加成功';
     open v_yz for select v_str from dual;
   end if;
 exception
   when v_c then
     v_str:='添加失败';
     open v_yz for select v_str from dual; --这样将v_str转换为游标然后赋给输出参数v_yz
 end;

---------------------------------------------
如果明白或解决了问题,别忘了和大家分享哦~

[其他解释]
null

热点排行