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

Oracle返回结果集用JDBC读取

    博客分类:
  • Java
阅读更多

废话不多说 进入正题: Oracle返回结果集然后用JDBC调用。 
方法有两种,以Oracle scott用户下的DEPT表为例。 

1. 程序包 

sql 代码
  1. create   or   replace  package Test_cursor  as     
  2.   type my_cursor  is  ref  cursor ;    
  3.    procedure  my_procedure(para  out  my_cursor);    
  4. end  Test_cursor;    
  5.   
  6. create   or   replace  package body Test_cursor  as     
  7.    procedure  my_procedure(para  out  my_cursor)  is     
  8.    begin     
  9.      open  para  for     
  10.        select  d.deptno, d.dname  from  dept d;    
  11.    end  my_procedure;    
  12. end  Test_cursor;    
  13.   
  14. 2. 程序包+存储过程    
  15.   
  16. create   or   replace  package types  as     
  17.   type cursorType  is  ref  cursor ;    
  18. end ;    
  19.               
  20. create   or   replace   procedure  getemps(p_cursor  out  types.cursorType)  as     
  21. begin     
  22.    open  p_cursor  for     
  23.      select  d.deptno, d.dname  from  dept d;    
  24. end ;    


以此类推,用程序包+函数同样可以。 

下面是测试类: 

java 代码
  1. package  com.chnic.procedure;    
  2.     
  3. import  java.sql.CallableStatement;    
  4. import  java.sql.Connection;    
  5. import  java.sql.DriverManager;    
  6. import  java.sql.ResultSet;    
  7. import  java.sql.SQLException;    
  8.     
  9. import  oracle.jdbc.driver.OracleTypes;    
  10.   
  11. public   class  TestProcedure {    
  12.   
  13. private  String path =  "jdbc:oracle:thin:@localhost:1521:Oracle" ;    
  14. private  String user =  "Scott" ;    
  15. private  String password =  "tiger" ;    
  16. private  Connection conn;    
  17. public  TestProcedure(){    
  18.    try  {    
  19.    Class.forName( "oracle.jdbc.driver.OracleDriver" );    
  20.    conn = DriverManager.getConnection(path, user, password);    
  21.   }  catch  (ClassNotFoundException e) {    
  22.    e.printStackTrace();    
  23.   }  catch  (SQLException e) {    
  24.    e.printStackTrace();    
  25.   }    
  26. }    
  27.   
  28. public   void  readFromProcedure(){    
  29.    try  {    
  30. //   CallableStatement call = conn.prepareCall("call getemps(?)");   //测试方法 1    
  31.    CallableStatement call = conn.prepareCall( "call TEST_CURSOR.MY_PROCEDURE(?)" );  //测试方法2    
  32.    call.registerOutParameter( 1 , OracleTypes.CURSOR);    
  33.    call.execute();    
  34.    ResultSet rs = (ResultSet)call.getObject( 1 );    
  35.     while (rs.next()){    
  36.     System.out.println(rs.getString( 1 ) +  " --- "  + rs.getString( 2 ));    
  37.    }    
  38.     this .releaseConnection(conn);    
  39.   }  catch  (SQLException e) {    
  40.    e.printStackTrace();    
  41.   }    
  42. }    
  43.   
  44. public   void  releaseConnection(Connection conn){    
  45.    try  {    
  46.    conn.close();    
  47.   }  catch  (SQLException e) {    
  48.    e.printStackTrace();    
  49.   }    
  50. }    
  51. public   static   void  main(String[] args){    
  52.   TestProcedure tp =  new  TestProcedure();    
  53.   tp.readFromProcedure();    
  54. }    
  55. }  
分享到:
评论
2 楼 yso 2008-03-06  
  帮大忙了,谢了。
1 楼 gqf2008 2007-10-11  
存储过程和数据结构定义如下:
CREATE OR REPLACE PACKAGE SmsService
IS
TYPE ret_record is RECORD(
P1 VARCHAR2(20),
P2 VARCHAR2(10));
TYPE msg_array IS TABLE OF ret_record INDEX BY BINARY_INTEGER;
END;

CREATE OR REPLACE PACKAGE gqf
IS
PROCEDURE proc1(para1 in varchar2,para2 out SmsService.msg_array);
END;
=================================================================================================
java代码如下:
OracleCallableStatement proc = null;
try {
proc =(OracleCallableStatement)con.prepareCall("{ CALL gqf.proc1 (?,?) }");
proc.setString(1, req.getPhoneNumber());
proc.registerOutParameter(2, OracleTypes.ARRAY,"SmsService.msg_array");
//proc.registerOutParameter(2, OracleTypes.ARRAY,"MSG_ARRAY");
//proc.registerOutParameter(2, OracleTypes.CURSOR);
//proc.registerOutParameter(2, OracleTypes.PLSQL_INDEX_TABLE);
//proc.registerIndexTableOutParameter(2,100, OracleTypes.OTHER, 100);
proc.execute();
//proc.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (proc != null) {
try {
proc.close();
} catch (SQLException e1) {
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
}
}
}

我试了所有ORACLE的数据类型,要么是在registerOutParameter报错,要么是在execute时报错,错误类型大概就是数据类型错误,要么就是无效的参数名称,网上搜索了很多资料没有找到解决办法,所以来这里问问是否有大侠有类似的开发经验,给小弟我指点一二,不胜感激!

相关推荐

    jdbc连接oracle字符集不同出现乱码

    当使用 JDBC 从远程 Oracle 数据库提取数据时,如果远程数据库使用的是 `US7ASCII` 字符集,而本地应用期望的数据字符集为 `ZHS16GBK`,则在读取过程中会因字符集转换错误而导致乱码。这是因为 Java 在处理字符串时...

    Flink JDBC Connector 支持Oracle

    Flink JDBC Connector 支持Oracle , Flink 1.13.6 支持Oracle 11.2.0.4

    gt-jdbc-2.6.5.jar_oracle_jdbc_Geotools_

    1. **JDBC Driver**: 这个JDBC驱动程序实现了Oracle数据库的特定接口,使得Java应用程序能够通过JDBC API与Oracle数据库建立连接,执行SQL语句,以及处理结果集。 2. **Geotools的JDBC数据存储(DataStore)**: Geo...

    Java连接Oracle数据库驱动包(JDBC)

    总之,Java通过Oracle JDBC驱动可以高效、安全地访问Oracle数据库,实现数据的读取、插入、更新和删除等一系列操作。这个驱动包为Java开发者提供了与Oracle数据库无缝集成的工具,大大简化了开发流程。

    (Oracle Database 12c Release 1 JDBC Driver)demo.zip

    - **性能优化**:理解并使用JDBC的批处理、预编译、结果集缓存等特性,可以显著提升应用程序的性能。 总之,Oracle Database 12c Release 1 JDBC Driver提供了全面的Java与Oracle数据库的互操作能力,通过研究"demo...

    用JDBC操作Oracle的存储过程返回值

    如果存储过程有结果集返回,可以使用`ResultSet`来获取。 总的来说,使用JDBC操作Oracle的存储过程返回值涉及了JDBC的基本操作,包括加载驱动、建立连接、创建CallableStatement、设置参数、执行存储过程、获取...

    java中xml文件的处理及oracle中xmltype的插入和读取.pdf

    Java 中 XML 文件的处理及 Oracle 中 XMLType 的插入和读取 Java 中 XML 文件的处理是指在 Java 应用程序中处理和操作 XML 文件的过程。在 Oracle 数据库中,XMLType 是一种特殊的数据类型,用于存储和处理 XML ...

    java调用oracle存储过程返回结果集,Record,cursor.[参考].pdf

    在Java编程中,调用Oracle数据库的存储过程并获取返回的结果集是一项常见的任务。这个例子展示了如何处理返回Record类型和Cursor类型的存储过程。Record类型在Oracle中是一种自定义的数据结构,可以用来模拟类似...

    jdbc-oracle.rar_JDBC ORACLE_java JDBC orac_java jdbc oracle_jdbc

    处理结果集`ResultSet`,我们可以遍历每一行数据,读取列值: ```java while (rs.next()) { System.out.println(rs.getString("column_name")); } ``` 最后,别忘了关闭打开的资源,防止内存泄漏: ```java rs....

    使用JDBC连接Oracle数据库

    ### 使用JDBC连接Oracle数据库 #### 一、简介与背景 Java Database Connectivity (JDBC) 是 Java 开发语言中的一项关键技术,它允许开发者通过标准 API 与多种类型的数据库进行交互。JDBC 提供了一种机制,使 Java...

    jdbc_on_oracle

    3. **结果集处理**:探讨如何有效地读取和处理查询返回的结果集,包括结果集的遍历、元数据的获取以及不同类型数据的处理技巧。 4. **事务控制**:详解如何使用JDBC控制事务,包括开启事务、提交和回滚操作,确保...

    Oracle9i 10g jdbc驱动 适合jdk1.3 jdk1.4

    6. 性能优化:Oracle 10g JDBC驱动相比9i有性能上的提升,包括更快的查询速度、更高效的内存管理以及对大结果集处理的优化。 在使用这些驱动时,开发者需要注意以下几点: - 确保JDK版本与驱动兼容,避免出现运行时...

    oracle-jdbc.zip

    4. **处理结果集**: 遍历`ResultSet`,读取查询结果。 ```java while (rs.next()) { System.out.println(rs.getString("column_name")); } ``` 5. **关闭资源**: 完成操作后,记得关闭连接和其他资源,以释放...

    使用jdbc_oracle实现的分页功能

    5. **处理结果集**:遍历ResultSet,读取每一行数据,进行业务逻辑处理。 6. **关闭资源**:在完成操作后,记得关闭ResultSet、Statement以及Connection,以释放系统资源。 在实现增删改功能时: - **插入数据**...

    JDBC驱动(Oracle、MySql)

    5. **处理结果集**:对于查询操作,会返回ResultSet对象,可以遍历该结果集获取查询结果。 6. **关闭资源**:使用完数据库连接、Statement或PreparedStatement对象后,必须关闭它们,释放系统资源,防止内存泄漏。 ...

    oracle的jdbc驱动包

    在处理结果集时,ResultSet对象扮演了关键角色。它是一个游标,可以从数据库检索一行数据,并允许向前或向后移动,读取或修改记录。 事务管理是JDBC中的另一个重要概念。通过Connection对象的`setAutoCommit()`和`...

    Oracle 超大文件的保存和读取

    在Oracle数据库存储超大文件时、以流的方式分段读取和保存,避免内存溢出。本工具类提供两个方法: 1、读取文件保存到Oracle数据库Blob字段(支持超大文件) 2、从数据库中读出大字段到文件中(分块读取)

    如何避免JDBC引起的内存溢出情况

    这种配置下,MySQL会使用游标的方式返回结果集,即只在客户端缓存部分数据,并且可以按需获取更多的行,这样可以有效地减少内存占用。 **2. SQL Server** 对于SQL Server,同样推荐使用游标模式来获取结果集。可以...

    通过JDBC连接Oracle数据库的十大技巧

    可以使用Oracle的游标(Cursor)来逐行读取,减少内存占用。例如,使用ResultSet的scroll方法: ```java Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);...

    oracle数据库的clob大字段在jdbc中的处理方式

    以上就是通过JDBC读取Oracle数据库中CLOB字段并转换为String的基本过程。需要注意的是,由于CLOB可能包含大量数据,因此在读取时要考虑到性能和内存消耗。如果数据过大,可以考虑分块读取或使用流式处理,避免一次性...

Global site tag (gtag.js) - Google Analytics