设为首页 收藏本站
查看: 954|回复: 0

[经验分享] java 调用oracle数据库返回的结果集

[复制链接]

尚未签到

发表于 2016-8-4 15:37:54 | 显示全部楼层 |阅读模式
  例子表结构:

-- 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)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252902-1-1.html 上篇帖子: 关于oracle表名区分大小写的问题 下篇帖子: 关于Oracle数据库优化的几点总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表