Quantcast
Channel: IT社区推荐资讯 - ITIndex.net
Viewing all articles
Browse latest Browse all 15843

Hibernate 调用返回值的存储过程

$
0
0
注:原创作品,转载请注明出处。

     曾一度认为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推荐




Viewing all articles
Browse latest Browse all 15843

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>