`
solitary
  • 浏览: 73896 次
社区版块
存档分类
最新评论

jdbc 取得Oracle存储过程返回的动态结果集

阅读更多

       当我们需要从oracle 数据库中获取一个数据的集合(例如:所有用户信息),我们通过存储过程可以这样完成。这里做一个简单的样例,供大家一起学习参考。

       实验环境: win xp sp3 , oracle 10.1.0.2.0 , pl/sql developer 9.0.2 , jdk1.6.29

1. 创建数据库表


create table PERSON
(
  id    VARCHAR2(50) not null  primary key ,
  uname VARCHAR2(50),
  upass VARCHAR2(50),
  age   NUMBER(3)
);

向表中添加实验数据:

 insert into PERSON (ID, UNAME, UPASS, AGE)
values ('1', 'douhaoa888888', 'sd', 20);

insert into PERSON (ID, UNAME, UPASS, AGE)
values ('2', 'douhaoa888888', 'dsd', 50);

 

2. 定义存储过程

注意: 在 pl/sql developer 环境中执行下列语句时,package  与 package body 要分别放在对应的窗口内执行,否则报错。
窗口位置为:文件 -->新建 -->程序窗口-->package :

 

create or replace package testlist2
is
   type namelist is REF CURSOR;
   procedure getPersonNames2 (personNames out namelist);
end;

 

窗口位置为:文件 -->新建 -->程序窗口-->package body :

 

 create or replace package body testlist2 is
   procedure getPersonNames2 (personNames out namelist)
   as
   begin
     open personNames for select uname,upass,age from person;
    
   end getPersonNames2;
end;

 

3. 创建 jdbc 程序

  创建一个 java 项目,在 classpath中加入 ojdbc14.jar , 这个包可以在 oracle 安装目录的 oracle\product\10.1.0\Db_1\jdbc\lib 这个下面找到。

 

 

package com.solitary.db.oracle.oracleproc;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

/**
 * 功能描述 :测试 调用 oracle 存储过程
 *
 */
public class OracleProc2 {
 private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl";
 private static final String DBUSER = "xxxx";
 private static final String DBPASSWORD = "xxxx";
 private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
 public static Connection getConnection (){
  Connection conn = null ;
  try {
   Class.forName(DBDRIVER).newInstance();
   conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
  } catch (Exception e) {
  }
  return conn ;
 }
 
 /**
  *
  * 功能描述: 调用所有用户信息的存储过程
  */
 public static void getPersonList2(){
  CallableStatement cstmt = null ;
  ResultSet rs = null ;
  try {
   cstmt = getConnection().prepareCall("{ call testlist2.getPersonNames2(?)}");
   cstmt.registerOutParameter(1, OracleTypes.CURSOR);
   cstmt.execute();
   rs = ((OracleCallableStatement)cstmt).getCursor(1);
   while ( rs.next()){
    System.out.println(rs.getString("uname") + "  " + rs.getString("upass") + "  " + rs.getInt("age"));
   }
  } catch (SQLException e) {
  }
 }
 
 public static void main(String[] args) {
  getPersonList2();
 }
 
}

 

把上面代码中的数据库用户名和密码改成你本机的信息,运行一下,就可以看到已经可以得到返回结果了。

 

4. 关于 ref cursor

 ref cursor  是抽象类型,不能定义变量,必须派生出新的类型才能使用。

弱类型派生: type mytype is ref cursor ;

不指定return type,能和任何类型的CURSOR变量匹配。

强类型派生: type mytype is ref cursor return emp%rowtype;

指定retrun type,CURSOR变量的类型必须和return type一致。

分享到:
评论

相关推荐

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    2.12 执行计划并取得数据行 50 2.13 SQL执行——总览 52 2.14 小结 53 第3章 访问和联结方法 55 3.1 全扫描访问方法 55 3.1.1 如何选择全扫描操作 56 3.1.2 全扫描与舍弃 59 3.1.3 全扫描与多块读取 60 ...

    db2开发经验

    15. **从存储过程返回结果集(游标)的用法:** 存储过程可以返回一个游标作为结果集,以便应用程序逐行处理数据。 16. **类型转换函数:** 常见的类型转换函数包括`CAST`和`CONVERT`,用于在不同类型之间转换数据。 ...

    DB2数据库用户手册

    - **从存储过程返回结果集(游标)的用法**:通过定义游标并使用`FETCH`命令来逐行检索结果集。 - **类型转换函数**:如`CAST`和`CONVERT`等函数可用于类型转换。 - **存储过程的互相调用**:一个存储过程可以调用另一...

    DB2使用经验积累

    13. **从存储过程返回结果集(游标)的用法**:存储过程可以通过定义输出参数或返回一个游标来返回结果集。 14. **类型转换函数**:DB2提供了一系列类型转换函数,如`CAST`、`CONVERT`等,用于在不同数据类型之间进行...

    DB2手册pdf

    在存储过程中返回结果集通常涉及声明和打开游标,然后将其作为输出参数返回。例如: ```sql CREATE PROCEDURE MyProcedure (OUT cursor_result CURSOR FOR SELECT * FROM my_table) BEGIN DECLARE CONTINUE HANDLER...

    牛新庄:DB2使用经验

    - **从存储过程返回结果集的用法**:使用`RETURN QUERY`语句返回查询结果,例如: ```sql CREATE PROCEDURE get_data() BEGIN RETURN QUERY SELECT * FROM table_name; END ``` - **类型转换函数**:使用`...

    java功能代码

    首先,指定Oracle JDBC驱动的类名,并定义用于存储数据库连接的变量。在`init()`方法中,通过读取配置文件中的属性(如数据库URL、用户名和密码),加载JDBC驱动并建立数据库连接。`fetch()`方法用于执行SQL查询,...

    JAVA数据库技巧一览

    String className = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr"; String uid = "system"; String pwd = "manager"; Class.forName(className); Connection ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    14.5、返回XML数据 14.6、本章摘要 14.7、开发实战讲解(基于Oracle数据库) 第15章 Struts基础开发 15.1、Struts简介 15.2、配置Struts开发环境 15.3、开发第一个Struts程序 15.4、Struts工作原理 15.5、...

    用友内部NC二次开发培训文档

    处理返回结果。 - **3.2.6 客户端代码说明** - **知识点**:分析客户端代码,了解其实现机制。 - **主要内容**: - 请求发起方式; - 数据传输格式; - 错误处理机制。 #### 四、NC数据库持久化技术 ##### ...

    PL/SQL 基础.doc

    6) PL/SQL: 存储在数据库内运行, 其他方法为在数据库外对数据库访问,只适合ORACLE; 2. PL/SQL 1) PL/SQL(Procedual language/SQL)是在标准SQL的基础上增加了过程化处理的语言; 2) Oracle客户端工具访问Oracle...

    ssh(structs,spring,hibernate)框架中的上传下载

    这是Hibernate3引入的新特性,对于包含重量级大数据的表字段,这种抽取方式提高了对大字段操作的灵活性,否则加载Tfile对象的结果集时如果总是返回fileContent,这种批量的数据抽取将可以引起数据库的"洪泛效应"。...

    基础的java教程 Java学习资料

    Java是由Sun Microsystems(现已被Oracle公司收购)在1995年推出的,它的设计目标是“一次编写,到处运行”。Java采用了类C++的语法,但移除了指针和内存管理等复杂特性,使得它更加安全和易于学习。Java的运行基于...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    在数据库处理方面,不需要在数据层借助存储过程及数据库服务器端函数封装过多的业务逻辑,因此数据库系统采用相对精巧的MySQL[6]。 该在线博客系统服务器端如果需要布置到其他主机上,则该主机必备条件如下: 1. ...

Global site tag (gtag.js) - Google Analytics