用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_refcu