java 调用oracle数据库返回的结果集

   例子表结构:

Sql代码   收藏代码
  1. -- Create table  
  2. create table YONGHU  
  3. (  
  4.   USERID NUMBER not null,  
  5.   NAME   VARCHAR2(20) not null,  
  6.   AGE    VARCHAR2(20) not null  
  7. )  
  8. tablespace TEST  
  9.   pctfree 10  
  10.   initrans 1  
  11.   maxtrans 255  
  12.   storage  
  13.   (  
  14.     initial 128K  
  15.     next 128K  
  16.     minextents 1  
  17.     maxextents unlimited  
  18.     pctincrease 0  
  19.   );  
  20. -- Create/Recreate primary, unique and foreign key constraints   
  21. alter table YONGHU  
  22.   add constraint PK_TEST_ID primary key (USERID)  
  23.   using index   
  24.   tablespace USERS  
  25.   pctfree 10  
  26.   initrans 2  
  27.   maxtrans 255  
  28.   storage  
  29.   (  
  30.     initial 64K  
  31.     minextents 1  
  32.     maxextents unlimited  
  33.   );  

   jvav调用oracle返回的数据集我想到的有三种实现方式:调用sql语句、调用视图、存储过程这里主要说明存储过程调用。

    由于在定义Oracle存储过程时无法直接指定参数的数据类型为:ref cursor,而是首先通过以下方法将ref cursor进行了重定义:

  1、定义包,在包中定义数据类型:FuxjResultSet(ref cursor类型)

 

Sql代码   收藏代码
  1. --定义FuxjPackage包,定义ref cursor类型  
  2. create or replace package FuxjPackage is  
  3.   type FuxjResultSet is ref cursor;  
  4. end FuxjPackage;  

  2、定义存储过程使用:FuxjResultSet类型的数据作为输出参数返回数据集

Sql代码   收藏代码
  1. --存储过程使用ref cursor类型的变量返回数据集  
  2. create or replace procedure getemps(p_cursor out FuxjPackage.FuxjResultSet,  
  3.                                     userName in varchar2) as  
  4. begin  
  5.   open p_cursor for  
  6.     select * from yonghu where name = userName;  
  7. end;  

 3、oracle自己调用

 

Sql代码   收藏代码
  1. declare  
  2.   userId  number;  
  3.   name    varchar2(20);  
  4.   age     varchar2(20);  
  5.   rownum_ integer;  
  6.   c       FuxjPackage.FuxjResultSet;  
  7. begin  
  8.   name := '熊敏';  
  9.   getemps(c, name); --orecle调用时输出参数将定义的和输出参数一样类型的数据放入参数位置即可  
  10.   loop  
  11.     FETCH c INTO userId, name,age;  
  12.     EXIT WHEN c%NOTFOUND;  
  13.     DBMS_OUTPUT.PUT_LINE(userId || '===' || name || '====' || age || '==');  
  14.   END LOOP;  
  15.   CLOSE c;  
  16. end;  

 

 4、java代码调用

Java代码   收藏代码
  1. package dao;  
  2.   
  3. import java.sql.*;  
  4. import java.sql.Connection;  
  5. import oracle.jdbc.driver.*; //该包位于  ojdbc14.jar 中  
  6.   
  7. public class Proc {  
  8.     public static void main(String[] args) {  
  9.         try {  
  10.             String driver_class = "oracle.jdbc.driver.OracleDriver";  
  11.             String connect_string = "jdbc:oracle:thin:@127.0.0.1:1521:min"/*要变动的是数据库服务器的地址以及数据库名称"psmis"*/  
  12.             String query = "call getemps(?,'熊敏')"//调用存储过程的语法,输出参数用”?“表示  
  13.             Connection conn;  
  14.             Class.forName(driver_class);  
  15.             conn = DriverManager.getConnection(connect_string, "test""test"); //链接、用户名、密码  
  16.             CallableStatement cstmt = conn.prepareCall(query); //CallableStatement 为调用存储过程的特有类  
  17.             cstmt.registerOutParameter(1, OracleTypes.CURSOR); //注册存储过程的输出参数为游标类型--即resultSet类型  
  18.             cstmt.execute(); //执行存储过程  
  19.             ResultSet rset = (ResultSet) cstmt.getObject(1); //获取数据集合  
  20.             while (rset.next())  
  21.                 System.out.println(rset.getString(1) + rset.getString(2)  
  22.                         + rset.getString(3));  
  23.             cstmt.close();  
  24.         } catch (Exception a) {  
  25.             a.printStackTrace();  
  26.         }  
  27.     }  
  28. }  

 

  说明:需要导入ojdbc14.jar、classes12.jar

   (路劲oracle安装目录D:\oracle\product\10.2.0\db_1\install\patches\5923165\files\jdbc\lib)

你可能感兴趣的:(Java技术)