JAVA中使用参数含有游标的存储过程
2017-11-07 19:36
411 查看
JAVA中使用参数含有游标的存储过程
关于存储过程: 存储过程是一组为了完成特定功能的SQL语句集, 经编译后存储在数据库中,用户通过指定存储过程的名字(给出参数)来执行它游标:游标(CURSOR)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果
首先创建一个含有游标参数的存储过程
包头部分:
create or replace package mypackage is
type empcursor is ref cursor;
procedure queryEmpList(dno in number,empList out empcursor);
end mypackage;
包体部分:
create or replace package body mypackage is
procedure queryEmpList(dno in number,empList out empcursor)
as
begin
open empList for select * from emp where deptno=dno;
end;
end mypackage;
1. JDBC调用存储过程(参数含有游标的)
书写DBUtils工具类,例如:package demotest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtils { private static String driver = "oracle.jdbc.OracleDriver"; private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; private static String user = "ksxx_26"; private static String password = "ksxx_26"; static{ try { Class.forName(driver); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(e); } } public static Connection getConn(){ try { return DriverManager.getConnection(url, user, password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static void close(Connection conn, Statement st, ResultSet rs){ if(conn != null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(st != null){ try { st.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(rs != null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { System.out.println(DBUtils.getConn()); } }
书写Junit单元测试工具类,例如:
package demotest; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import oracle.jdbc.internal.OracleCallableStatement; import oracle.jdbc.internal.OracleTypes; import oracle.jdbc.oracore.OracleType; import org.junit.Test; public class TestProcedure { @Test public void test(){ String sql = "{call mypackage.QUERYEMPLIST(?,?)}"; Connection conn = null; CallableStatement call = null; ResultSet rs = null; try{ conn = DBUtils.getConn(); call = conn.prepareCall(sql); call.setInt(1, 10); call.registerOutParameter(2, OracleTypes.CURSOR); call.execute(); rs = ((OracleCallableStatement)call).getCursor(2); while(rs.next()){ String name = rs.getString("ename"); double sal = rs.getDouble("sal"); System.out.println(name+"\t"+sal); } }catch (Exception e) { e.printStackTrace(); } } }
2.在MyBatis中调用存储过程(参数含有游标的)
DAO中代码:public interface EmpDao { List<Emp> findbyDeptno(Map map); }
EmpMapper.xml文件代码
<mapper namespace="org.ks.dao.EmpDao"> <resultMap type ="org.ks.entity.Emp" id= "cursorMap"> <result column ="empno" property="empno" /> <result column ="ename" property="ename" /> <result column ="job" property="job" /> <result column ="mgr" property="mgr" /> <result column ="hiredate" property="hiredate" /> <result column ="sal" property="sal" /> <result column ="comm" property="comm" /> <result column ="deptno" property="deptno" /> </resultMap > <select id ="findbyDeptno" statementType="CALLABLE" parameterType="java.util.Map" > {call mypackage.QUERYEMPLIST( #{deptno, jdbcType=VARCHAR, mode=IN}, #{empList, mode=OUT, jdbcType=CURSOR,resultMap=cursorMap})} </select > </mapper>
Junit单元测试部分:
package org.ks.test; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.junit.Test; import org.ks.dao.EmpDao; import org.ks.entity.Emp; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestEmpProcedure { @Test public void test(){ ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ac.getBean("empDao", EmpDao.class); List<Emp> empList = new ArrayList<Emp>();//声明一个集合用来接收查询后返回的游标结果 Map<String, Object> paramMap = new HashMap<String, Object>(); paramMap.put("deptno", 20); paramMap.put("empList", empList); dao.findbyDeptno(paramMap); empList = (List<Emp>)paramMap.get("empList"); for(Emp emp : empList){ System.out.println(emp); } } }
相关文章推荐
- 【java工具】使用jdbc访问数据库获取某个存储过程信息及下面参数信息
- Oracle存储过程传入类似java中list、数组类型的参数并使用
- JAVA调用存储过程输出参数为游标
- JAVA调用ORACLE带数组输入参数和返回游标结果集的存储过程
- 存储过程的输出参数为游标,PL/SQL中如何调用 Java代码如何调用
- mysql 存储过程中 limit之后使用分页变量,传入分页参数. 类似于微博游标分批次获取信息;问号参数类似于c#的string.format;问号占位符
- 如何在Oracle中使用Java存储过程 (详解)
- 在存储过程中声明参数时使用字符默认大小带来的问题?
- 在NHibernate中不能够使用带有out 参数的存储过程
- DB2 中游标的使用以及 存储过程的写法
- 带输出参数的存储过程的使用及在C#中调用问题
- Oracle8i中使用Java语言来开发存储过程
- 存储过程中使用表名为参数
- asp.net使用返回参数的存储过程
- 如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程。
- 如何在Oracle中使用Java存储过程 (详解)
- 使用c#调用oracle存储过程获取存储过程参数信息
- 在存储过程里使用OleDB和Sql连接对于参数的区别
- SQLServer-存储过程中使用字符串和分隔符实现传递数组参数
- 一个使用游标的存储过程的实例