欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-09 22:18:27
...

   例子表结构:

-- Create table
create table YONGHU
(
  USERID NUMBER not null,
  NAME   VARCHAR2(20) not null,
  AGE    VARCHAR2(20) not null
)
tablespace TEST
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 128K
    next 128K
    minextents 1
    maxextents unlimited
    pctincrease 0
  );
-- Create/Recreate primary, unique and foreign key constraints 
alter table YONGHU
  add constraint PK_TEST_ID primary key (USERID)
  using index 
  tablespace USERS
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

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

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

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

 

--定义FuxjPackage包,定义ref cursor类型
create or replace package FuxjPackage is
  type FuxjResultSet is ref cursor;
end FuxjPackage;

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

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

 3、oracle自己调用

 

declare
  userId  number;
  name    varchar2(20);
  age     varchar2(20);
  rownum_ integer;
  c       FuxjPackage.FuxjResultSet;
begin
  name := '熊敏';
  getemps(c, name); --orecle调用时输出参数将定义的和输出参数一样类型的数据放入参数位置即可
  loop
    FETCH c INTO userId, name,age;
    EXIT WHEN c%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(userId || '===' || name || '====' || age || '==');
  END LOOP;
  CLOSE c;
end;

 

 4、java代码调用

package dao;

import java.sql.*;
import java.sql.Connection;
import oracle.jdbc.driver.*; //该包位于  ojdbc14.jar 中

public class Proc {
	public static void main(String[] args) {
		try {
			String driver_class = "oracle.jdbc.driver.OracleDriver";
			String connect_string = "jdbc:oracle:thin:@127.0.0.1:1521:min"; /*要变动的是数据库服务器的地址以及数据库名称"psmis"*/
			String query = "call getemps(?,'熊敏')"; //调用存储过程的语法,输出参数用”?“表示
			Connection conn;
			Class.forName(driver_class);
			conn = DriverManager.getConnection(connect_string, "test", "test"); //链接、用户名、密码
			CallableStatement cstmt = conn.prepareCall(query); //CallableStatement 为调用存储过程的特有类
			cstmt.registerOutParameter(1, OracleTypes.CURSOR); //注册存储过程的输出参数为游标类型--即resultSet类型
			cstmt.execute(); //执行存储过程
			ResultSet rset = (ResultSet) cstmt.getObject(1); //获取数据集合
			while (rset.next())
				System.out.println(rset.getString(1) + rset.getString(2)
						+ rset.getString(3));
			cstmt.close();
		} catch (Exception a) {
			a.printStackTrace();
		}
	}
}

 

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

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