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 的配置文件里面添加相关的配置。
分享到:
相关推荐
这段Java代码首先创建了一个CallableStatement对象,然后注册了Out参数(游标),执行存储过程,并从存储过程返回的结果集中读取数据。 总结一下,Oracle存储过程的Out游标是PL/SQL中返回多行结果的有效方式,Java...
这篇博客可能详细讨论了如何在Java中与Oracle存储过程交互,特别是涉及到了游标的使用。 首先,让我们理解存储过程的概念。存储过程是一组预先编译的SQL语句,可以接受参数,执行复杂操作,然后返回结果。在Oracle...
- 存储过程类似于 Java 中的方法或 C# 中的函数,可以接受输入参数、返回输出参数以及返回状态值。 2. **优点**: - **性能优化**:存储过程是预编译的,因此每次执行时不需要重新编译,从而提高了执行速度。 - ...
5. **游标变量**: - 隐式游标的名字是`SQL`,提供了如`SQL%FOUND`、`SQL%NOTFOUND`、`SQL%ROWCOUNT`等属性,用于获取最近执行SQL语句的相关信息。 6. **游标使用注意事项**: - 显式游标需要显式打开(`OPEN`)、...
4. 使用Java的JDBC API调用这些存储过程,处理返回的游标结果。 这种技术在需要在应用程序中分批处理大量数据或者需要动态构建查询结果时非常有用。通过游标,我们可以灵活地控制对数据库的访问,同时避免一次性...
在Java中,你可以通过CallableStatement对象调用存储过程,然后使用ResultSet对象作为游标处理返回的结果。 总结,SQL Server中的游标和存储过程的结合使用,为我们提供了一种灵活处理大量数据的方式。在存储过程中...
在Java中调用存储过程返回多行记录,通常使用CallableStatement接口。你需要定义输入参数,设置输出参数,然后执行存储过程。结果可以通过游标对象读取,Java会自动处理游标的遍历。 此外,自定义函数是另一个强大...
定义游标包括声明游标变量、编写SQL查询并关联到游标,然后通过OPEN、FETCH和CLOSE操作来操作游标。例如: ```sql DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name WHERE condition; ...
- 可以声明并使用游标变量来存储游标状态,方便在PL/SQL块中传递和操作。 4. **游标循环处理** - 在PL/SQL中,经常用FOR循环处理游标,简化代码,提高可读性。 5. **游标属性** - %FOUND:检查是否从游标中成功...
- `ResultSet`对象`rs`可以像处理普通的SQL查询结果一样进行遍历,读取存储过程返回的数据。 注意,处理返回的Cursor时,必须确保存储过程已经正确地打开并返回了游标,否则在Java端无法正常获取数据。此外,为了...
### Oracle存储过程返回结果集详解 #### 一、概述 在Oracle数据库中,存储过程是一种重要的编程组件,它能够执行一系列SQL语句并处理复杂的业务逻辑。存储过程的一个常见应用场景是返回结果集(Record Set),这有...
存储过程中包含四个游标(`DATA`、`CHECKINFO`、`BACINFO`、`TESINFO`),这些游标返回的数据将被用于构建最终的JSON输出。 ```sql CREATE OR REPLACE PROCEDURE your_procedure( os_Message IN VARCHAR2, os_...
返回列表的存储过程通常会返回一个结果集,这在Java中可以通过`ResultSet`对象处理。然而,Oracle的PL/SQL没有直接的“返回列表”机制,而是通过游标(Cursor)实现。你可以定义一个OUT参数为REF CURSOR类型,然后在...
【Java存储过程实现Oracle远程逻辑备份与恢复】 Oracle数据库是一个基于网络计算的系统,它内建了对Java的支持,包括Oracle JVM(Java Virtual Machine),这使得开发者能够在数据库服务器端执行复杂的计算任务,...
要使过程返回数据集,关键在于使用`OUT`类型的参数,并且该参数应为`sys_refCursor`系统引用游标类型。这样,过程可以在PL/SQL程序中将数据集作为输出传递给调用者。例如,在提供的示例中,`add_sal`过程接受一个...
本篇将详细讨论存储过程返回结果集的两种类型:调用者(to caller)和客户应用(to client)。 首先,让我们理解这两种返回结果集类型的差异: 1. **调用者(to caller)**: 当存储过程的结果集返回给调用者时,...
本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储过程的高级应用,包括 Hibernate 调用 Oracle 存储过程和 Java 调用 Oracle 存储过程的方法。 Oracle 存储过程基础知识 Oracle 存储过程是 Oracle...
标题与描述均指出的问题是“类型长度大于最大值(Java调用存储过程)”,这通常意味着在使用Java程序调用Oracle数据库的存储过程时,某个字段或参数的长度超过了数据库定义的最大长度。这种情况可能由多种因素引起,...
存储过程内部首先声明了一系列变量,包括`@total`(记录总数)、`@start`(起始行号)、`@end`(结束行号)、`@id`、`@name`(从`news`表中读取的数据)以及循环计数器`@i`。 接下来,创建了一个游标`mycur`,用于...
当存储过程需要返回列表数据时,Oracle建议使用游标(CURSOR)或自定义的包类型。首先,创建一个包来定义游标: ```sql CREATE OR REPLACE PACKAGE TESTPACKAGE AS TYPE Test_CURSOR IS REF CURSOR RETURN HYQ....