注:原创作品,转载请注明出处。
 
      曾一度认为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推荐