例子表结构:
-- 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)