`
bdk82924
  • 浏览: 563414 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java 调用 Oracle 存储过程返回结果集

 
阅读更多

 

转自:http://wxy0327.itpub.net/post/16888/149516

         http://www.blogjava.net/TrampEagle/archive/2011/05/03/23605.html

 

Oracle 存储过程返回结果集用 ref cursor 实现。试验步骤如下:


1. 建立 ref cursor 类型和过程

 

drop table  prices  
/

drop table  test  
/

create or replace package types
as
    type ref_cursor is ref cursor;
end;
/

create table prices(
    ric varchar(6) primary key,
    price number(7,2),
    updated date )
/

create or replace function sp_get_prices(v_price in number) 
    return types.ref_cursor
as
    stock_cursor types.ref_cursor;
begin
    open stock_cursor for 
    select ric,price,updated from prices;

    return stock_cursor;
end;

/
 insert into prices 
select  '1',12,sysdate from dual  union all 
select  '2',123,sysdate from dual  union all 
select  '3',1245,sysdate from dual  
/
commit;

--创建表    
 create table test   
(   
carno     varchar2(30),   
carinfoid number   
)   
/   
--带 参数,无返回
create or replace procedure pro_ins(mt1 in varchar, mt2 in number) 
as  
carinfo_id number;   
begin  
  
insert into test(test.carno,test.carinfoid) values(mt1,mt2);   
commit;   
end pro_ins;   
/ 

--带参数,有返回
create or replace procedure pro_return(para1 in varchar2,para2 out varchar2)  as  
  
begin 
  
  select para1||' add ' into  para2 from dual;    
  
end pro_return; 
/
 

 


 

 
 

2. Java 调用

 

 

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import oracle.jdbc.driver.OracleTypes;

public class JDBCDemo
{

    /**
     * Compile-time flag for deciding which query to use
     */
    private boolean useOracleQuery = true;

    /**
     * Class name of Oracle JDBC driver
     */
    private String driver = "oracle.jdbc.driver.OracleDriver";

    /**
     * Initial url fragment
     */
    private String url = "jdbc:oracle:thin:@";

    /**
     * Standard Oracle listener port
     */
    private String port = "1521";

    /**
     * Oracle style of calling a stored procedure
     */
    private String oracleQuery = "begin ? := sp_get_prices(?); end;";

    /**
     * JDBC style of calling a stored procedure
     */
    private String genericQuery = "{ call ? := sp_get_prices(?) }";

    /**
     * Connection to database
     */
    private Connection conn = null;

    public JDBCDemo(String host, String db, String user, String password) throws ClassNotFoundException, SQLException
    {

        // construct the url
        url = url + host + ":" + port + ":" + db;

        // load the Oracle driver and establish a connection
        try
        {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException ex)
        {
            System.out.println("Failed to find driver class: " + driver);
            throw ex;
        } catch (SQLException ex)
        {
            System.out.println("Failed to establish a connection to: " + url);
            throw ex;
        }
    }

    /**
     * 
     * 返回 Cursor结果集
     * 
     * @throws SQLException
     * @author
     * @date
     */
    private void exeRetCursor() throws SQLException
    {

        String query = useOracleQuery ? oracleQuery : genericQuery;
        query = "{ call ? := sp_get_prices(?) }";
        query = "begin ? := sp_get_prices(?); end;";
        System.out.println("Query: " + query + "n");
        CallableStatement stmt = conn.prepareCall(query);

        // register the type of the out param - an Oracle specific type
        stmt.registerOutParameter(1, OracleTypes.CURSOR);

        // set the in param
        stmt.setFloat(2, 1);

        // execute and retrieve the result set
        stmt.execute();
        ResultSet rs = (ResultSet) stmt.getObject(1);

        // print the results
        while (rs.next())
        {
            System.out.println(rs.getString(1) + " | " + rs.getFloat(2) + " |" + rs.getDate(3).toString());
        }

        rs.close();
        stmt.close();
    }

    /**
     * 
     * 无返回结果
     * 
     * @throws SQLException
     * @author
     * @date
     */
    private void exeNoRet() throws SQLException
    {

        String query = "{ call pro_ins(?,?) }";
        System.out.println("Query: " + query + "n");
        CallableStatement stmt = conn.prepareCall(query);

        // register the type of the out param - an Oracle specific type

        // set the in param
        stmt.setString(1, "abcd");
        stmt.setInt(2, 111);

        // execute and retrieve the result set
        stmt.execute();
        System.out.println(" call pro_ins success");

        stmt.close();
    }

    /**
     * 
     * 返回 String
     * 
     * @throws SQLException
     * @author
     * @date
     */
    private void exeRetSingle() throws SQLException
    {

        String query = "{ call pro_return(?,?) }";
        System.out.println("Query: " + query + "n");
        CallableStatement stmt = conn.prepareCall(query);

        // register the type of the out param - an Oracle specific type

        // set the in param
        stmt.setString(1, "abcd");
        stmt.registerOutParameter(2, Types.VARCHAR);

        // execute and retrieve the result set
        stmt.execute();
        String ret = stmt.getString(2);
        // print the results
        System.out.println("get pro_return:" + ret);

        stmt.close();
    }

    /**
     * Cleanup the connection
     */
    private void cleanup() throws SQLException
    {

        if (conn != null)
            conn.close();
    }

    /**
     * Runs the class
     */
    public static void main(String[] args) throws Exception
    {

        try
        {
            // assign the args to sensible variables for clarity
            String host = "127.0.0.1";
            String db = "orcl";
            String user = "zxinweb";
            String password = "zxinweb";

            // and execute the stored proc
            JDBCDemo jdbc = new JDBCDemo(host, db, user, password);
            // 返回 Cursor结果集
            jdbc.exeRetCursor();
            // 无返回
            jdbc.exeNoRet();
            // 返回String
            jdbc.exeRetSingle();
            jdbc.cleanup();
        } catch (ClassNotFoundException ex)
        {
            System.out.println("Demo failed");
        } catch (SQLException ex)
        {
            System.out.println("Demo failed: " + ex.getMessage());
        }
    }
}

 

分享到:
评论

相关推荐

    java调用oracle存储过程返回结果集,Record,cursor参照.pdf

    Java调用Oracle存储过程返回结果集Record、Cursor参照 Java调用Oracle存储过程返回结果集(Record)是指在Java程序中通过调用Oracle存储过程来获取记录集的结果。下面将详细介绍相关知识点。 创建Type 在Oracle中...

    java调用oracle存储过程返回结果集,Record,cursor.[参考].pdf

    总结来说,这个示例展示了如何在Java中调用Oracle存储过程,处理返回的Record类型数据,并将这些数据以Cursor形式返回。在实际开发中,这种技术常用于处理复杂的业务逻辑,尤其是在需要大量自定义数据结构和返回多行...

    Oracle存储过程返回结果集

    本篇将深入探讨如何在Oracle存储过程中创建并返回一个结果集,并结合Java代码展示如何在应用程序中使用这个结果集。 首先,我们需要理解`OUT`参数的概念。在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`...

    Java调用oracle存储过程通过游标返回临时表

    本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...

    java调用oracle存储过程或者函数

    以上就是Java调用Oracle存储过程或函数的主要知识点,实践中要根据具体情况进行适当的调整和优化。在处理过程中,参考Oracle的JDBC文档和官方示例,以及Java API文档,将有助于理解和解决问题。

    oracle的存储过程如何返回结果集

    ### Oracle存储过程返回结果集详解 #### 一、概述 在Oracle数据库中,存储过程是一种重要的编程组件,它能够执行一系列SQL语句并处理复杂的业务逻辑。存储过程的一个常见应用场景是返回结果集(Record Set),这有...

    hibernate query调用oracle存储过程

    以下是一个简单的示例,展示了如何调用一个不带参数的Oracle存储过程: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); session....

    java调用Oracle存储过程的代码

    总结,通过Java调用Oracle存储过程,我们需要配置JDBC驱动,建立数据库连接,创建CallableStatement,设置参数,执行存储过程,并处理返回的结果。在这个例子中,我们展示了如何调用一个简单的存储过程并打印返回的...

    用java调用oracle存储过程

    以上代码展示了如何在Java中调用Oracle数据库的三种类型的存储过程:无返回值的存储过程、有单个返回值的存储过程以及返回列表的存储过程。对于无返回值的存储过程,主要涉及的是参数的输入,通过`execute()`方法...

    java调用oracle存储过程(游标)相关

    总之,Java调用Oracle存储过程,尤其是处理游标,需要理解JDBC的使用、Oracle特定的类型以及存储过程的参数传递方式。通过合理的编程实践,我们可以高效地在Java应用程序中集成Oracle数据库的复杂操作。

    CallableStatement调用Oracle存储过程返回结果集(ResultSet).doc

    ### CallableStatement调用Oracle存储过程返回结果集(ResultSet) #### 一、无返回值的存储过程调用 在本节中,我们通过一个具体的例子来详细介绍如何使用`CallableStatement`来调用Oracle数据库中的无返回值存储...

    Spring JdbcTemplate调用Oracle存储过程实现CRUD

    存储过程使用 `SYS_REFCURSOR` 输出参数将结果集返回给调用方。 `P_EMP_ADD` 存储过程用于添加新员工信息,并返回添加结果。该过程接收两个输入参数:`V_ID` 和 `V_NAME`,分别用于添加员工 ID 和姓名。存储过程...

    java调用oracle存储过程并得到结果集

    在Java编程中,调用Oracle数据库的存储过程并获取结果集是一项常见的任务。在这个场景下,我们将使用JDK 1.5版本,MyEclipse集成开发环境,以及Oracle 11g数据库。以下是对这个主题的详细解释: 首先,我们需要确保...

    JAVA调用ORACLE存储过程

    ### JAVA调用ORACLE存储过程知识点详解 #### 一、背景与概述 在现代软件开发过程中,集成多种技术栈是常态。特别是在企业级应用中,Java 和 Oracle 数据库的组合非常常见。通过 Java 调用 Oracle 存储过程不仅能够...

    java调用oracle存储过程.wps

    java调用oracle存储过程.wps java调用oracle存储过程.wps java调用oracle存储过程.wps

    Java调用oracle存储过程总结

    通过这些步骤,你可以成功地从Java应用程序中调用Oracle存储过程。确保正确配置JDBC驱动,理解存储过程的参数类型,并熟悉JDBC API,这样就能高效地实现数据交互了。在开发过程中,可以参考Oracle的官方文档以及各种...

    java调用oracle存储过程入门实例 增删改查

    在这个入门实例中,我们将重点探讨如何通过Java调用Oracle的存储过程来实现这些基本操作,并结合使用DOM4J解析XML配置文件来管理数据库连接。 首先,存储过程是Oracle数据库中预编译的SQL语句集合,它可以封装复杂...

    JAVA调用ORACLE存储过程通用类

    ### JAVA调用ORACLE存储过程通用类 #### 概述 在Java开发中,经常会遇到需要与数据库交互的情况,特别是当涉及到复杂的业务逻辑时,利用数据库的存储过程可以有效地提高程序性能并简化代码结构。本篇文章将详细...

Global site tag (gtag.js) - Google Analytics