`
hello_player
  • 浏览: 152537 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java 调存储过程返回游标变量

    博客分类:
  • Java
阅读更多
Java 开发中有时候需要调用一个返回结果集的存储过程,批量返回查询数据结果。下面用个简单的存储过程演示下调用和处理过程。
数据库脚本执行:
Create Table student (grade varchar2(5), num number(6), Name Varchar2(20), age Integer);
Insert Into student Values('101', 100001, 'Jack', 20);
Insert Into student Values('102', 100001, 'Mike', 21);
Insert Into student Values('101', 100002, 'Merry', 19);
Insert Into student Values('102', 100002, 'Tony', 20);


存储过程:
Create Or Replace Package Pkg_School Is
  Type Ref_Cursor Is Ref Cursor;
  Procedure Find_Students_By_Grade(p_Grade    Varchar2,
                                   Out_Cursor Out Ref_Cursor);
End Pkg_School;

Create Or Replace Package Body Pkg_School Is
  Procedure Find_Students_By_Grade(p_Grade    Varchar2,
                                   Out_Cursor Out Ref_Cursor) Is
  Begin
    Open Out_Cursor For
      Select Num, Name, Age From Student Where Grade = p_Grade;
  End Find_Students_By_Grade;
End Pkg_School;




Java 代码:
package callprocedure;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import org.apache.log4j.Logger;

import junit.framework.TestCase;

public class DAOTest extends TestCase {
	// private JdbcTemplate jdbcTemplate;
	private Logger logger = Logger.getLogger(DAOTest.class);

	private String url;
	private String username;
	private String password;
	private String driver;
	private Connection con;
	private CallableStatement cs;
	private ResultSet rs;
	private String grade;

	public void setUp() throws Exception {
		super.setUp();
		grade = "101";

		url = "jdbc:oracle:thin:@127.0.0.1:1521:oradb";
		username = "ora";
		password = "ora";
		driver = "oracle.jdbc.driver.OracleDriver";

		Class.forName(driver);
		con = DriverManager.getConnection(url, username, password);
	}

	public void tearDown() throws Exception {
		super.tearDown();
		rs = null;
		cs = null;
		con = null;
	}

	public void testGetStudentByGrade() throws Exception {
		cs = con.prepareCall("call pkg_school.find_students_by_grade(?, ?)");
		cs.setString(1, grade);
		cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
		cs.execute();

		rs = (ResultSet) cs.getObject(2);
		ResultSetMetaData rsmd = rs.getMetaData();

		String columnName;
		String columnValue;
		while (rs.next()) {
			for (int i = 1; i <= rsmd.getColumnCount(); i++) {
				columnName = rsmd.getColumnName(i);
				columnValue = rs.getString(columnName);
				logger.debug(columnName + "=" + columnValue);
			}
			logger.debug("---------------------------");
		}
	}
}


JUnit 测试结果:

DAOTest - NUM=100001
DAOTest - NAME=Jack
DAOTest - AGE=20
DAOTest - ---------------------------
DAOTest - NUM=100002
DAOTest - NAME=Merry
DAOTest - AGE=19
DAOTest - ---------------------------




final Map result = new HashMap();
		
Object obj = jdbcTemplate.execute("call pkg_school.find_students_by_grade(?, ?)", new CallableStatementCallback(){

	public Object doInCallableStatement(CallableStatement cs)
			throws SQLException, DataAccessException {
		cs.setString(1, grade);
		cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
		cs.execute();
		
		rs = (ResultSet) cs.getObject(2);
		ResultSetMetaData rsmd = rs.getMetaData();
		}
});

第二个方法我就写个大概了,跟第一个方法的区别就是用的是 spring 的 jdbcTemplate 来执行的,这样的话连接这块就不要自己去获取了,要在 spring 的配置文件里面添加相关的配置。
分享到:
评论

相关推荐

    mybatis入门-简单的配置文件的书写,数据库查询语句的书写以及存储过程调用

    这是一个简单的mybatis项目,包含mybatis需要用到的jar包,里面同时包含配置文件的书写,查询语句的配置调用以及存储过程的调用的书写方法,还有就是包含游标输出的存储过程,如何去接收返回游标的示例;还有就是一...

    pl/sql入门教程

    plsql入门 游标变量 Oracle EXTRACT()函数 用Java调用存储过程 ORACLE用户常用数据字典的查询使用方法

    java核心面试技术点

    java 内存模型 ( java memory model ):根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有对象成员变量都储存在主存中,对于所有线程都是共享的。...

    浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量。简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量。 1、declare定义的变量类似java类中的局部变量,仅在类中生效。即只在存储过程中的begin...

    java核心面试

    java 内存模型 ( java memory model ):根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有对象成员变量都储存在主存中,对于所有线程都是共享的。...

    PL/SQL 基础.doc

    返回一个基于数据库定义的类型 DECLARE v_emp s_emp%ROWTYPE; /*s_emp为表的名字*/ 注:与RECORD类型中定一个record相比,一步就完成, 而RECORD类型中定义分二步:a. 所有的成员变量都要申明; b. 实例化变量;...

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...

    Java面试宝典2020修订版V1.0.1.doc

    19、用JDBC如何调用存储过程 69 20、JDBC中的PreparedStatement相比Statement的好处 71 21、写一个用jdbc连接实例。 71 22、ArrayList和Vector的区别? 73 23、List、Set和Map的区别? 74 24、Collection 和 ...

    Java数据库编程宝典3

    3.9.1 在存储过程中使用输入参数 3.9.2 存储过程中使用输出参数 3.10 小结 第4章 JDBC入门 4.1 什么是JDBC 4.2 两层和三层模型 4.2.1 两层模型 4.2.2 三层模型 4.3 SQL的一致性 4.4 JDBC兼容性 4.5 ...

    Oracle包应用详解.doc

    (1)包是一种数据库对象,将逻辑上相关的PL/SQL类型、对象和子程序组合成一个更大的单位,是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL ...

    PLSQLDeveloper下载

    /*test_procedure可以省略*/ 至此,test_procedure存储过程已经完成,经过编译后就可以在其他PL/SQL块或者过程中调用了。函数与过程具有很大的相似性,此处不再详述。 编辑本段游标  游标的定义为:用游标来指代一...

    Java数据库编程宝典2

    3.9.1 在存储过程中使用输入参数 3.9.2 存储过程中使用输出参数 3.10 小结 第4章 JDBC入门 4.1 什么是JDBC 4.2 两层和三层模型 4.2.1 两层模型 4.2.2 三层模型 4.3 SQL的一致性 4.4 JDBC兼容性 4.5 ...

    Oracle 10g 开发与管理

    (四)游标变量 (动态游标) 66 1.定义 66 2.声明游标变量 66 3.打开游标变量 66 (五) 使用游标更新数据库 66 7.9 异常处理 66 (一)预定义异常 66 (二)非预定义异常 67 1.声明异常名 67 2.将异常名与标准的Oracle...

    java面试宝典

    234、存储过程和函数的区别 55 235、事务是什么? 55 236、游标的作用?如何知道游标已经到了最后? 55 237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器...

    Java数据库编程宝典4

    3.9.1 在存储过程中使用输入参数 3.9.2 存储过程中使用输出参数 3.10 小结 第4章 JDBC入门 4.1 什么是JDBC 4.2 两层和三层模型 4.2.1 两层模型 4.2.2 三层模型 4.3 SQL的一致性 4.4 JDBC兼容性 4.5 ...

    java基础题 很全面

    2. 存储过程和函数的区别。 23 3. 事务是什么? 23 4. 游标的作用?如何知道游标已经到了最后? 23 5. 触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别? 23 简答题 23 1. 作用域public...

    Java数据库编程宝典1

    3.9.1 在存储过程中使用输入参数 3.9.2 存储过程中使用输出参数 3.10 小结 第4章 JDBC入门 4.1 什么是JDBC 4.2 两层和三层模型 4.2.1 两层模型 4.2.2 三层模型 4.3 SQL的一致性 4.4 JDBC兼容性 4.5 ...

    oracle复习笔记之PL/SQL程序所要了解的知识点

    异常处理机制、存储函数/存储过程、触发器。 为方便大家跟着我的笔记练习,为此提供数据库表文件给大家下载:点我下载 为了要有输出的结果,在写PL/SQL程序前都在先运行这一句: set serveroutput on 结构: declare...

Global site tag (gtag.js) - Google Analytics