`
huibin
  • 浏览: 754370 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Oracle JDBC 获取 Function返回的结果集

阅读更多
前几天项目里数据存储支持了存储过程,当时赶进度,只是简单的拿SQL Server 2000做了测试。今天同事要用Oracle9i数据库,于是研究了一下Oracle的存储过程,不看不知道啊,居然Oracle里要支持存储过程如此复杂!!上网查资料,自己做实验,终于弄了大半夜才鼓捣出来!
 
项目里的需求很简单:通过一个存储过程返回一个数据集(当然,我只负责简单调用存储过程,存储过程内部可能很复杂了^_^)。不同于SQL Server 2000的存储过程,Oracle里的存储过程分为procedure和function两种,如果用procedure的话,无法直接返回结果集,读取结果集的方式比较复杂;function是可以返回结果集的存储过程,调用相对简单些。
 
下面的介绍将以一张BOOK表的查询为例:
create table BOOK
(
  BOOKNUMBER CHAR(3) not null,
  BOOKNAME   VARCHAR2(50),
  BOOKPRICE  NUMBER(18,2)
)
 
要返回数据集,就需要使用Oracle里的reference cursor类型,不过Oracle里这个类型用的方式比较罗唆(搞不明白Oracle为什么要弄的这么复杂),首先要声明一个引用的cursor类型,这个通过创建一个包来实现:
CREATE OR REPLACE PACKAGE PKG_TEST
AS
    TYPE REFCURSOR IS REF CURSOR;
END PKG_TEST;
 
然后创建我们的function存储过程:
create or replace function query_book(book_no varchar) return PKG_TEST.REFCURSOR is
  Result PKG_TEST.REFCURSOR;
begin
  open Result for
       select * from book where book_no =book.booknumber;
      
  return(Result);
end query_book;
在这个存储过程中,我们传入了查询键值key,返回了一个数据集对象
 
这样我们就有了一个名为query_book的存储过程,它可以返回一个结果数据集。要调用这个存储过程,可以通过CallableStatement接口来调用,这样需要写成类似'{?=call query_book(?)}'的查询语句,并且参数和返回值都必须用代码设置;在这里,一些简单的存储过程,也可以通过查询来调用。下面就是我使用的调用方法:
public class FuncTest {
  public static void main(String[] argsthrows Exception {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection  connection = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:LeeDB"
        "TEST""test");
    Statement  stmt = connection.createStatement();
    ResultSet  dataset = stmt.executeQuery("SELECT query_book('001') FROM DUAL");
    if (dataset.next()) {
      ResultSet  ret = (ResultSet)dataset.getObject(1);
      
      whileret.next() ) {
        System.out.print(ret.getString(1));
        System.out.print("\t");
        System.out.print(ret.getString(2));
        System.out.print("\t");
        System.out.println(ret.getDouble(3));
      
    }
  }
}
注意这里返回的数据集中内嵌了function返回的数据集,需要进行特殊处理。
 
上面代码执行之后可以成功返回结果:
001 Pascal编程 20.0
分享到:
评论

相关推荐

    Oracle函数_JDBC常用写法

    5. **处理结果集**:遍历`ResultSet`获取查询结果,使用`resultSet.next()`判断是否有下一行,`resultSet.getString(columnIndex)`等方法获取列值。 6. **关闭资源**:在完成操作后,记得关闭`ResultSet`、`...

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

    本篇将详细介绍如何使用CallableStatement调用Oracle存储过程,并处理返回的结果集(ResultSet)。 一、无返回值的存储过程 在Oracle中,一个无返回值的存储过程可能只执行某些操作,例如插入数据。以下是一个简单...

    JDBC与Oracle存储过程

    **JDBC与Oracle存储过程详解** Java Database Connectivity (JDBC) 是Java编程语言中用于连接数据库的标准API,它使得Java开发者能够与各种数据库系统进行交互,包括Oracle数据库。Oracle存储过程是预编译的SQL语句...

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

    在执行后,通过`CallableStatement.getObject()`方法获取函数返回的结果。 四、异常处理 在调用过程中,可能会遇到SQL异常或其他运行时异常,需要使用try-catch-finally结构进行异常处理。捕获`SQLException`,根据...

    Java调用oracle函数返回oracle类(类似)集合

    执行SQL后,通过`getARRAY`方法获取返回的数组对象,然后将其转换为Java中的`String`数组进行处理。 请注意,实际应用中可能需要根据数据库连接信息、驱动版本和Oracle函数的具体返回类型进行调整。此外,为了确保...

    oracle 存储过程 函数 dblink

    在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程提高了代码的重用性和执行效率,同时也便于实现复杂的业务逻辑。 #### 二...

    groovy将JDBC中oracle存储过程游标转换为多层json

    在本文档中,我们将探讨如何使用Groovy脚本结合JDBC技术从Oracle存储过程中获取数据,并将其转换为多层JSON格式。该方法特别适用于需要从XML输入中提取数据并将其转化为JSON输出的应用场景。以下是详细的步骤和技术...

    Oracle面试题

    在实际应用中,比如JDBC查询,代码示例展示了如何连接Oracle数据库、执行查询、处理结果集并确保资源正确释放。在面试中,对这些核心概念的理解和实际操作经验都是考察的关键点。理解并熟练运用这些知识点,有助于...

    Java调用Oracle的过程和函数

    这使得函数能够执行复杂的计算并返回结果,这对于应用程序来说是非常有用的特性。在本例中,我们将学习如何通过Java来调用具有不同参数类型的Oracle函数。 #### 2. 准备工作 在开始编写Java代码之前,需要确保已经...

    如何调用oracle的函数、存储过程

    如果你需要在像Delphi这样的应用程序中调用Oracle的函数和存储过程,可以使用Oracle的客户端库(如oci.dll)或者ODBC/JDBC驱动。例如,在Delphi中,你可以使用Oracle的DBExpress组件(如TOracleQuery、...

    Java调用Oracle的过程和函数.doc

    1. **JDBC驱动**: 要连接到Oracle数据库,首先需要一个兼容的JDBC驱动,例如Oracle JDBC驱动(ojdbc.jar)。这个驱动程序允许Java应用程序与Oracle数据库进行通信。 2. **建立连接**: 使用`java.sql.DriverManager`...

    JAVA 与ORACLE 存储过程及函数

    对于Oracle函数,由于它会返回一个值,所以在Java中调用时,需要使用`registerOutParameter()`方法先声明返回值的数据类型,然后通过`CallableStatement`的`getXXX()`方法获取返回值。例如,如果函数返回一个整数,...

    Oracle调用Java代码过程

    这个类定义了连接DB2所需的各种常量,如JDBC驱动类名、URL、用户名和密码,并提供了一个静态方法`queryJyxx`,用于执行SQL查询并返回结果。 **步骤三:创建后台函数** 在Oracle中创建一个函数`My_fun_queryJyxx`,...

    Oracle数据库存储过程.pdf

    首先,存储过程是一组为了完成特定功能的SQL语句集,它可以接受参数、执行复杂的逻辑,并可以返回结果。存储过程的执行速度快,因为它们在第一次执行时会被编译和优化,在后续调用时可以直接使用优化后的代码。 ...

    oracle 相关api及plsql一些帮助资料

    4. 子程序:可以创建过程(PROCEDURE)和函数(FUNCTION),它们可以接受参数,返回结果,并在PL/SQL代码中调用。 5. 游标:用于处理查询结果集,可以逐行读取数据。 6. 异常处理:通过BEGIN...EXCEPTION...END结构...

    Oracle PlSql 存储过程

    用 Java 调用 Oracle 存储过程可以使用 JDBC 或 Oracle 的java驱动程序。下面是用 Java 调用 Oracle 存储过程的总结: 1. 无返回值的存储过程 无返回值的存储过程可以使用 CallableStatement 来调用。 2. 有...

    oracle调优,乱码解决等汇总

    通过JDBC可以获取Oracle Sequence的新值,例如使用CallableStatement调用DBMS_OUTPUT.PUT_LINE或NEXTVAL过程。 7. **Oracle卸载**: 卸载Oracle涉及到停止所有Oracle服务,删除注册表项,移除文件和目录,以及清理...

    oracle_oracle_oraclepl/sql_

    6. **游标**:游标用于处理SQL查询结果集,允许逐行操作数据,常用于循环遍历查询结果。 7. **异常处理**:通过EXCEPTION关键字定义异常处理块,能够捕获并处理运行时错误,提高程序健壮性。 8. **动态SQL**:允许...

    Oracle_PLSQL.rar_Java plsql_oracle_oracle doc_pl sql_plsql

    - **JDBC(Java Database Connectivity)**:Java通过JDBC API与Oracle数据库交互,包括连接、执行SQL和PL/SQL、处理结果集等。 - **CallableStatement接口**:用于执行存储过程和函数,支持IN、OUT、IN OUT参数。...

    ajax开发实例,设置中文,连接oracle数据库

    Class.forName("oracle.jdbc.driver.OracleDriver"); ``` 2. 创建数据库连接: ```java Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@//hostname:port/service_name", "username", ...

Global site tag (gtag.js) - Google Analytics