项目需要,并返回结果集和另一个状态,此前未使用过存储过程,故作以记录:
sql代码:
-- Create table
create table JYXT_HDBM
(
ID VARCHAR2(50),
MID VARCHAR2(50),
ORDERNO VARCHAR2(50),
HDTYPE VARCHAR2(2),
MONEY NUMBER default 0.0,
PAYTYPE VARCHAR2(2),
TIME DATE,
STATUS VARCHAR2(2),
REMARKS VARCHAR2(200)
)
INSERT INTO jyxt_hdbm
(ID, mid, orderno, hdtype, money, paytype, TIME, status, remarks)
VALUES
(v_id, v_mid, v_orderno, v_hdtype, v_money, v_paytype, v_time, v_status, v_remarks);
--创建包,声明游标、存储过程
create or replace package users_package is
type search_results is ref cursor;
PROCEDURE users_proc(results_out out search_results, hdtype IN OUT VARCHAR);
end users_package;
--创建(实例化)存储过程
create or replace package body users_package is
procedure users_proc (results_out out search_results, hdtype IN OUT VARCHAR)
is
begin
dbms_output.put_line('start....');
if hdtype is not null then
open results_out for select t.orderno,t.money,t.hdtype FROM jyxt_hdbm t WHERE t.hdtype=hdtype;
hdtype:='单项活动';
else
open results_out for select t.orderno,t.money,t.hdtype FROM jyxt_hdbm t;
hdtype:='所有活动';
end if;
dbms_output.put_line('end!!!!!');
END users_proc;
end users_package;
---pl sql 测试调用
declare
cur_search_results jy.users_package.search_results;
CURSOR myCur is select t.orderno,t.money,t.hdtype FROM jyxt_hdbm t;
hdbmrow myCur%ROWTYPE ; --要保证行里的字段与游标里的行字段一致
hdtype VARCHAR(10);
BEGIN
hdtype:='';
jy.users_package.users_proc(cur_search_results, hdtype);
-- OPEN cur_search_results;
dbms_output.put_line(hdtype);
LOOP
FETCH cur_search_results into hdbmrow; --游标中查询出来的一行into进定义的变量hdbmrow中
EXIT WHEN cur_search_results%NOTFOUND;
dbms_output.put_line(hdbmrow.orderno||' ' ||hdbmrow.money||' ' ||hdbmrow.hdtype);
END LOOP;
CLOSE cur_search_results;
END;
jsp代码(只摘录了核心代码):
try{
String type = ToolKit.dealNull(request.getParameter("type"));
DataSource ds = GlobalParameter.getDataSource_User();
Connection conn = ds.getConnection();
String sql = "{call users_package.users_proc(?, ?)}";
CallableStatement cstmt = conn.prepareCall(sql);
cstmt.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
/* 第二个参数,定义了in out类型的参数,所以做以下设置*/
cstmt.setString(2,type);
cstmt.registerOutParameter(2, Types.VARCHAR);
cstmt.execute();
ResultSet rs = null;
//获取游标结果集
rs = ((oracle.jdbc.OracleCallableStatement)cstmt).getCursor(1);
//获取字符弄返回参数
String str = cstmt.getString(2);
out.println("---------"+str+"---------</br>");
//处理返回游标
while(rs.next()){
out.print(" 订单号:"+rs.getString (1));
out.print(" 金额:"+rs.getDouble(2));
out.print(" 类型:"+rs.getString (3));
out.println("</br>");
}
}catch(Exception e){
System.out.println("error:"+e.toString());
}
分享到:
相关推荐
java调用存储过程,支持获取return值,output返回值,以及查询的表数据,表数据允许有多个查询结果集
### JAVA调用存储过程知识点详解 #### 一、无结果集返回的存储过程调用 在Java中调用不返回结果集的存储过程时,主要步骤包括建立连接、准备调用语句、设置输入参数、执行存储过程以及处理可能产生的警告信息。 1...
总结来说,Java调用存储过程并处理返回数组,需要理解存储过程的定义,正确使用`CallableStatement`或其子类如`OracleCallableStatement`,以及处理Oracle特定数据类型的方法。通过这些技巧,我们可以有效地在Java...
Oracle存储过程可以返回多个结果集,因此我们需要使用`CallableStatement`而不是`PreparedStatement`。调用存储过程的语法是`{call procedure_name(参数列表)}`。例如: ```java CallableStatement cs = connection....
当需要从存储过程中返回多个结果时,通常会使用结果集。本篇将深入探讨如何在Oracle存储过程中创建并返回一个结果集,并结合Java代码展示如何在应用程序中使用这个结果集。 首先,我们需要理解`OUT`参数的概念。在...
### 二、调用存储过程返回单个值的步骤 #### 2.1 准备工作 首先,确保已正确配置数据库连接。这通常涉及到以下几点: - 加载合适的JDBC驱动程序。 - 建立到数据库的连接。 #### 2.2 创建存储过程 假设我们有一个名...
下面将详细介绍如何在MyEclipse中使用Java调用存储过程,并探讨相关的知识点。 1. **存储过程概述** 存储过程是预编译的SQL语句集合,存储在数据库服务器中,可以被多次调用,以提高执行效率。它们允许开发者封装...
如果需要调用多个存储过程或函数,可以使用`CallableStatement.addBatch()`方法将多个调用语句添加到批处理队列,然后用`CallableStatement.executeBatch()`一次性执行,提高效率。 六、性能优化 1. 使用连接池:...
### Java调用存储过程——传入集合参数:深入解析与实践 #### 核心知识点概览 在Java应用中,调用数据库存储过程时,往往需要处理复杂的参数传递,特别是当参数为集合类型时,这一过程变得更加具有挑战性。本文将...
本篇文章将深入探讨如何使用Java与MySQL数据库进行交互,实现调用存储过程,并提供一个测试通过的实例。 首先,理解存储过程是数据库管理系统提供的一种预编译的SQL语句集合,它封装了特定的功能,可以提高执行效率...
首先,确保你已经安装了MySQL数据库,并且在数据库中创建了一个或多个存储过程。例如,`findAllBook`、`pro_test`和`pro_user`都是在`book`数据库中的存储过程。你可以使用MySQL命令行客户端或者可视化工具(如MySQL...
有些存储过程可能返回多个结果集,可以使用`ResultSetMetaData`获取元数据,`nextSet()`方法移动到下一个结果集,`wasNull()`检查上一个结果集中是否返回了NULL值。 总结起来,Java调用存储过程涉及的关键点包括: ...
Java 调用存储过程的优点是可以减少应用程序中的等待时间,因为存储过程运行在 DBMS 自身,而不是在 Java 代码中执行多个 SQL 语句。这样可以戏剧性地优化性能。同时,存储过程也可以从很多流行的 DBMS 中免费使用,...
在Oracle数据库中,返回多个结果集是一个常见的需求,特别是在处理复杂的查询或存储过程时。一个结果集通常对应于SQL查询的执行结果,但有时我们可能需要在一个操作中获取并处理多个独立的结果集。这就涉及到了...
在Java编程中,调用数据库中的存储...总的来说,Java调用存储过程涉及到了JDBC API的使用,参数的设置和结果集的处理,以及可能的事务管理和连接池操作。了解和掌握这些知识,对于开发高效、稳定的数据库应用至关重要。
总的来说,Java调用存储过程是数据库交互的一个重要环节,理解其原理和操作流程对于开发高效、可靠的数据库应用至关重要。在实际项目中,根据具体需求选择合适的设计策略,既能保证功能实现,又能兼顾性能和维护性。
存储过程可以接收多个参数,这些参数可以是输入参数、输出参数或输入/输出参数。在本例中,`InsertUser` 存储过程接收了 8 个参数,分别是 `@UserName`、`@Title`、`@Guid`、`@BirthDate`、`@Description`、`@Photo`...
总结,通过Java调用Oracle存储过程,我们需要配置JDBC驱动,建立数据库连接,创建CallableStatement,设置参数,执行存储过程,并处理返回的结果。在这个例子中,我们展示了如何调用一个简单的存储过程并打印返回的...