注:原创作品,转载请注明出处。
曾一度认为oracle的函数和存储过程的区别,就是function能返回值,存储过程不能返回值。但在项目中的很多存储过程都有返回值,仔细发现得出问题的窍门。
存储过程的返回值是通过参数实现的,存储过程的参数有三种类型一种是 in,一种是 out
一种是既有in也有out类型。 out的参数就是返回数值的参数。
下面是实例
本实例需要环境:
1,hibernate3.0
2,oracle 10g
3,创建一个TBL_ADDRESS,字段有id,name,info,remark且有一条记录
java代码:
下面是oracle的存储过程
/*创建存储过程,该存储过程三个参数,前两个是输出参数
最后一个是输入参数*/
已有 0人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐
曾一度认为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推荐