注:原创作品,转载请注明出处。
曾一度认为oracle的函数和存储过程的区别,就是function能返回值,存储过程不能返回值。但在项目中的很多存储过程都有返回值,仔细发现得出问题的窍门。
存储过程的返回值是通过参数实现的,存储过程的参数有三种类型一种是 in,一种是 out
一种是既有in也有out类型。 out的参数就是返回数值的参数。
下面是实例
本实例需要环境:
1,hibernate3.0
2,oracle 10g
3,创建一个TBL_ADDRESS,字段有id,name,info,remark且有一条记录
java代码:
package com.supan.test;
import com.supan.dao.imp.UserDaoImp;
public class hibernate1
{
public static void main(String[] args)
{
UserDaoImp udi = new UserDaoImp();
udi.getUserNameAndInfo();
}
}
package com.supan.dao.imp;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.supan.dao.UserDao;
public class UserDaoImp extends HibernateDaoSupport implements UserDao
{
public void getUserNameAndInfo()
{
//没有spring的注入,只有人工苦逼的注册sessionFactory属性
Configuration cof = new Configuration().configure();
this.setSessionFactory(cof.buildSessionFactory());
//定义存放结果的结果map
final Map<String,String> result = new HashMap<String, String>();
getHibernateTemplate().execute(new HibernateCallback<Object>()
{
@Override
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
session.doWork(new Work()
{
@Override
public void execute(Connection conn) throws SQLException
{
CallableStatement proc = null;
try
{
proc = conn.prepareCall("{call PROC_GETUSER_NAME_AGE(?,?,?)}");
//注意:这里是注册输出参数
proc.registerOutParameter(1, java.sql.Types.VARCHAR);
proc.registerOutParameter(2, java.sql.Types.VARCHAR);
//注意:这里是传递输入参数
proc.setLong(3, 1L);
//执行存储过程
proc.execute();
//获取执行完的存储过程的返回值
result.put("name", proc.getString(1));
result.put("age", proc.getString(2));
}
catch(Exception e)
{
//logger.error("访问数据库失败");
e.printStackTrace();
result.put("name", null);
result.put("age", null);
}
finally
{
if(null != proc)
{
proc.close();
}
}
}
});
return null;
}
});
System.out.println(result.get("name"));
System.out.println(result.get("age"));
}
}
下面是oracle的存储过程
/*创建存储过程,该存储过程三个参数,前两个是输出参数
最后一个是输入参数*/
create or replace procedure PROC_GETUSER_NAME_AGE(userName out varchar2,
userAge out varchar2,
userId in long)
AS
--声明该存储过程为“自治事物单元”
PRAGMA AUTONOMOUS_TRANSACTION;
--定义两个变量
v_userName varchar2(255);
v_userAge varchar2(255);
begin
select name, info into v_userName, v_userAge from TBL_ADDRESS t where t.id = userId;
userName := v_userName;
userAge := v_userAge;
--注意最后并没有return语句返回,返回靠的是输出参数
end;
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐