`
chnic
  • 浏览: 225827 次
  • 性别: 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时报错,错误类型大概就是数据类型错误,要么就是无效的参数名称,网上搜索了很多资料没有找到解决办法,所以来这里问问是否有大侠有类似的开发经验,给小弟我指点一二,不胜感激!

相关推荐

Global site tag (gtag.js) - Google Analytics