请大虾们指点一下:
         在java中如何调用Oracle存储过程得到一个ResultSet对象,能给一个例子吗(包括存储过程的定义和核心的java代码)?谢谢!

解决方案 »

  1.   

    http://www.cnblogs.com/wj-wangjun/archive/2008/04/09/1145174.html
      

  2.   

    Connection con=Class.forName("oracle.jdbc.driver.OracleDriver");
    String sql="select first_name from s_emp";
    PreparedStatement ps=con.prepareStatement(sql);
    ResultSet rs=ps.exexuteQuery();
      

  3.   

    错了 该
    ResultSet rs=ps.executeQuer();
      

  4.   

    try {
       CallableStatement cs = connection.prepareCall("{call myprocin(?)}");
       cs.setString(1, "a string");
       ResultSet rs = cs.executeQuery();
    } catch (SQLException e) {
    }
      

  5.   

    你的那个存储过程myprocin是如何定义的呀?
    我就想查询一张表,将其中的记录放到ResultSet中,想使用存储过程。
    但不知道怎么搞!
      

  6.   


    这是你在数据库里面定义的存储过程名字呀
    CREATE PROCEDURE myprocin 
     @str varchar(50)
    AS
    --你的业务逻辑
    ...
    --你要返回的结果集
    select * from xxx
    GO
      

  7.   

    使用Oracle存储过程增删改都可以实现,
    就是在查询方面想得到一个ResultSet对象,却总是不行。
    都郁闷了,哪位能给我详细的讲讲么?
      

  8.   

    定义的时候,总是报错,说是我的SELECT语句缺乏INTO字句。
    都晕死了,你说我要INTO字句干嘛呀!
      

  9.   

    对了,我使用的是oracle数据库,你这个
    CREATE PROCEDURE myprocin 
    @str varchar(50) 
    AS 
    --你的业务逻辑 
    ... 
    --你要返回的结果集 
    select * from xxx 
    GO 
    是SQLServer的语法,不是Oracle的吧?
      

  10.   


    Class.forName("oracle.jdbc.driver.Oracle.Driver");
    Connection conn=DriverManager.getConnection("jdbc:oracle:@localhost:1521:XE","sccot","tiger");
    Statement stmt=conn.createStatement();
    ResultSet rs=stm.executeQuery(sql);
      

  11.   

    我要使用Oracle存储过程来实现,不是普通的SQL语句。
    大虾们:多多指点一下小弟啦!
      

  12.   

    当然知道用CallableStatement来调用存储过程啊。问题是那个存储过程该怎么定义?
    能给个例子么?  
      

  13.   


    oracle的存储过程和sqlserver的存储过程java都是那么调用,你说的是数据库的存储过程怎么写谁知道你的是怎么写的,你把存储过程的代码贴出来啊,谁知道你说的什么INTO是从哪里来的
      

  14.   

    你具体要实现什么功能,请描述的详细一些。为什么需要将Oracle存储过程执行的结果在JAVA中封装成ResultSet对象?
    这个要求本身就是有问题的。数据处理可以完全在Oracle上直接实现(通过存储过程封装),存储过程执行结束后返回给JAVA环境的就是一个简单的值就可以了,然后在用JAVA程序来控制业务的跳转。没有必要让存储过程返回的内容再用JAVA封装成ResultSet对象呀!
    这个需要本身就是很很奇怪的!
      

  15.   

    我就是要获得一张表中的所有记录,将其显示出来。
    我知道JAVA调用存储过程都是一样的,其实问题出在那个ORACLE存储过程我不知道该怎么写。
      

  16.   

    oracle不太熟悉,似乎是这样CREATE OR REPLACE PROCEDURE TEST
    AS
    BEGIN
      select * from xxx
    END; 
      

  17.   

    我当初就是这么写得,可总是报错,说SELECT语句缺乏INTO字句!真是晕死了!
      

  18.   

    CREATE OR REPLACE PROCEDURE PRO_RETURN_RS(
        out_rs out sys_refcursor
      )
    AS
    BEGIN
      open out_rs for
      SELECT * FROM xxx;
    END;CallableStatement call = cn.prepareCall("{call pro_return_rs(?)}");
    call.registerOutParameter(1, OracleTypes.CURSOR);
    call.execute();
    ResultSet rs = (ResultSet) call.getObject(1);
      

  19.   

    java中使用如楼上各位的
    但是 oracle 数据库端定义 要在
    packages 和 package bodies 里面建立存储
    packages :
    create or replace package report is
      type ref_cur is ref cursor;
      procedure getCur (cur out report.ref_cur);
    end report;package bodies :
    create or replace package body report is
      procedure getCur (cur out report.ref_cur)  is
      begin
        open cur for 
        select * from yourtable;
      end;
    end report;java 调用:objConnection.prepareCall(" BEGIN report.getCur(?); END; ");
      

  20.   

    这个Oracle中使用了游标,而且是作为输出参数在使用。
    我在Oracle方面还是个菜鸟,对你上面的代码还有两点不够明白:
    一是为什么游标是输出型的参数。
    二是我在JAVA中调用时难道还要定义一个游标???要真是这样,我该怎么定义这个游标?
    (我的问题是不是很可笑啊?呵呵,没办法,真的不懂)
      

  21.   

    确保在返回ResultSet的时候你的连接没有关闭。
      

  22.   

    现在真正困扰我的是ORACLE。用存储过程增删改都没问题,就是查询的时候不行!
      

  23.   

    http://www.onjava.com/pub/a/onjava/2003/08/13/stored_procedures.html?page=last
      

  24.   

    CREATE OR REPLACE PACKAGE pk_utils
    AS
       TYPE rc IS REF CURSOR;   PROCEDURE querybysql (p_sql_text IN VARCHAR2, p_cursor OUT rc);
    END pk_utils;
    /CREATE OR REPLACE PACKAGE BODY pk_utils
    AS
       PROCEDURE querybysql (p_sql_text IN VARCHAR2, p_cursor OUT rc)
       IS
       BEGIN
          OPEN p_cursor FOR p_sql_text;
       END;
    END pk_utils;
    /Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn = DriverManager.getConnection( "dbc:oracle:thin:@127.0.0.1:1521:testdb", "test", "test");
    CallableStatement cs = conn.prepareCall("{call pk_utils.querybysql(?,?)}");
    cs.setString(1, "SELECT USER_CODE, USER_NAME FROM USERINFO WHERE ROWNUM<10");// 输入参数
    cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);// 输出参数
    cs.execute();
    ResultSet rs = (ResultSet) cs.getObject(2);
    while (rs.next()) {
        System.out.println(rs.getString(1));
    }
    测试通过
      

  25.   

       这个Oracle中使用了游标,而且是作为输出参数在使用。 
    我在Oracle方面还是个菜鸟,对你上面的代码还有两点不够明白: 
    一是为什么游标是输出型的参数。 
    ---  需要返回一个数据行的集合的话,方式之一就是 给游标定义一个游标类型的返回参数。
    二是我在JAVA中调用时难道还要定义一个游标???要真是这样,我该怎么定义这个游标? 
    (我的问题是不是很可笑啊?呵呵,没办法,真的不懂)
    --- java 里面不需要 用游标类型接收, 用 DataSet 类型接受就可以。
    下面是我的java source CallableStatement objCallableStatement 
      = objConnection.prepareCall(" BEGIN report.getCur(?); END; ");
        objCallableStatement.registerOutParameter(1,OracleTypes.CURSOR);
        objCallableStatement.execute();
        ResultSet objResultSet = (ResultSet)objCallableStatement.getObject(1);