`
DataBird
  • 浏览: 71701 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

JAVA调用ORACLE带数组输入参数和返回游标结果集的存储过程

阅读更多
参看了前人的一些资料,自己试了试,有几处改进:
1.关于字符集:11g的jdbc驱动叫orai18n.jar,之前是nls_charset.jar/classes12.jar
2.ArrayDescriptor:java传入oracle的数组需要处理一下
3.oracle.jdbc.OracleTypes.CURSOR:java获得oracle的游标。

package TEST;
import java.sql.*;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
public class test_array {
    static Connection connMyDB = null;
    public static Connection connDB() {
        Statement stmt;
        ResultSet rs;
        PreparedStatement pstmt;
        String driver = "oracle.jdbc.driver.OracleDriver";
        String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:wydb";
        try {
            Class.forName(driver);
            connMyDB = DriverManager.getConnection(strUrl, "dev", "dev");
        } catch (SQLException ex) {
            Logger.getLogger(test_array.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(test_array.class.getName()).log(Level.SEVERE, null, ex);
        }
        return connMyDB;
    }
    public static void main(String args[]) {
        ArrayList arrList = new ArrayList();
        try {
            CallableStatement proc = connDB().prepareCall("{ call p_web_sql_kpi(?,?,?,?,?,?,?,?,?,?) }"); //调用存储过程
            //不一样的地方,获得上面创建的自定义的类型,注意大小写
            ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("VARRAY_LIST", connMyDB);
            List list = new ArrayList();
            list.add("TRAFFIC_PD");
            list.add("TRAFFIC_TCH");
            list.add("REQ_TBF_DL_GPRS");
            //把list中的元素转换成自定义的类型
            ARRAY array = new ARRAY(descriptor, connMyDB, list.toArray());
            /*重要!这里输出的全是“???”试验NLS
            备注:如果在入库的过程中发现字符串的值没有入进去,
            请检查有没有加载该类库orai18n.jar(11g之前:nls_charset12.jar)*/
            String[] tem = (String[]) array.getArray();
            for (String str : tem) {
                System.out.println(str);
            }
            //设置参数, 和普通的一样
            proc.setString(1, "LC");
            proc.setString(2, "201104自行车赛");
            proc.setString(3, "2011-05-31");
            proc.setString(4, "2011-06-01");
            proc.setInt(5, 9);
            proc.setInt(6, 11);
            proc.setArray(7, array);
            proc.setInt(8, 1);
            proc.setInt(9, 10);
            proc.registerOutParameter(10, oracle.jdbc.OracleTypes.CURSOR);
            proc.execute();
            ResultSet rs = (ResultSet) proc.getObject(10);
            int cols = rs.getMetaData().getColumnCount();//width=how many cols
            while (rs.next()) {
                for (int i = 1; i <= cols; i++) {
                    System.out.print(rs.getString(i));
                    if (i != cols) {
                        System.out.print(" / ");//列之间的间隔符,最后1列不需要
                    }
                }
                System.out.println();
            }
            rs.close();
            proc.close();
        } catch (Exception ex) {
            ex.getMessage();
        } finally {
            try {
                connMyDB.close();
            } catch (SQLException ex) {
                Logger.getLogger(test_array.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}


我们的数据库字符编码一般选zhs16GBK用以支持中文,字符集不对,把nls_charset12.jar(11g以前的)添加到classpath里面去,jdbc的lib下面。
对于Oracle 11g R2+WINDOWS SERVER 2003:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Oracle Database 11g Release 2 JDBC Drivers 的解释:
ojdbc5.jar 用于 JDK 1.5 的类。它包含 JDBC 驱动程序类,但不包含在 Oracle Object 和 Collection 类型中支持 NLS 的类。
ojdbc6.jar 用于 JDK 1.6 的类。它包含 JDBC 驱动程序类,但不包含在 Oracle Object 和 Collection 类型中支持 NLS 的类。
orai18n.jar 用于 JDK 1.5 和 1.6 的 NLS 类。它包含在 Oracle Object 和 Collection 类型中支持 NLS 的类。
该文件代替旧的nls_charset.jar/classes12.jar 文件。
orai18n.jar - NLS classes for use with JDK 1.5, and 1.6. It contains classes for NLS support in Oracle Object and Collection types. This jar file replaces the old nls_charset jar/zip files.
下载网址,请用迅雷,否则需要注册的用户名和密码:
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html



sqlplus的command窗口下:
var v_result refcursor
declare
  v_kpi varray_list;
begin
  p_web_sql_kpi(v_usr        => '星星星',
                v_ciset      => '201104自行车赛',
                v_date_begin => '2011-05-31',
                v_date_end   => '2011-06-01',
                v_time_begin => '9',
                v_time_end   => '11',
                v_kpi        => varray_list('TRAFFIC_TCH',
                                            'TRAFFIC_PD',
                                            'REQ_TBF_DL_GPRS'),
                v_startidx   => 1,
                v_endidx     => 10,
                v_result     => :v_result);
end;
/
print v_result

1
0
分享到:
评论

相关推荐

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

    本文介绍了Java调用Oracle存储过程返回结果集Record和Cursor的相关知识点,包括创建Type、PACKAGE和PROCEDURE,Java代码中调用存储过程,并获取结果集。这些知识点对深入了解Oracle存储过程和Java调用Oracle存储过程...

    JAVA调用ORACLE存储过程通用类

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

    Java调用oracle存储过程输出自定义对象或二维表

    在Java编程中,与Oracle数据库交互是常见的任务之一,而调用Oracle存储过程可以实现复杂的业务逻辑。本文将深入探讨如何在Java中调用Oracle存储过程,并输出自定义对象或二维表,以此提升数据处理效率。 首先,我们...

    Oracle集合类型输出参数的PLSQL存储过程及其Java调用.docx

    ### Oracle集合类型输出参数的PL/SQL存储过程及其Java调用 #### 1. 引言 存储过程因其高效执行、事务处理能力以及安全性,在数据库应用程序中被广泛应用。特别是使用Oracle数据库时,PL/SQL(一种专为Oracle设计的...

    oracle 存储过程学习经典

    #### 八、Java调用Oracle存储过程 - **无返回值的存储过程**: 可以直接调用存储过程,无需关注返回值。 - **有返回值的存储过程**: - 非列表返回: 通常使用简单的数据类型作为返回值。 - 列表返回: 使用游标或...

    oracle存储过程学习经典[语法+实例+调用]

    5. **使用Java调用Oracle存储过程**: - **无返回值的存储过程**: 可以直接调用,如使用`CallableStatement`对象。 - **有返回值的存储过程**: - 非列表类型: 通过注册输出参数来接收返回值。 - 返回列表: 通常...

    Oracle数据库存储过程.pdf

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

    Oracle Database 12c PL/SQL开发指南 实例源代码

    2. **函数与过程**:如何定义和调用用户自定义的函数和过程,理解输入参数、输出参数、IN OUT参数的区别和使用。 3. **游标**:在PL/SQL中如何使用游标处理单行或多行数据,以及游标的声明、打开、关闭和循环遍历。...

    Oracle PL SQL Programming 第五版-带书签目录超清文字版

    5. **游标**:讲解如何使用游标进行动态查询和逐行处理结果集,包括显式和隐式游标,以及游标的使用技巧。 6. **集合类型**:介绍PL/SQL中的数组、关联数组、嵌套表和集合操作,这些在处理大量数据时非常有用。 7....

    oracle10 PL/SQL

    15. **与Java和.NET的互操作性**:10g版本加强了与其他语言的集成,支持调用Java存储过程和使用.NET组件。 通过深入学习和实践这些知识点,你将能够熟练掌握Oracle 10g PL/SQL,为数据库管理和应用程序开发打下坚实...

    Oracle PLSQL编程,第4版

    4. **游标**:游标用于在结果集上进行迭代,是处理单行数据或动态结果集的有效工具。书中的这一部分可能详细讲解了游标的使用和管理。 5. **表和记录变量**:这些变量可以用来存储多行数据,类似于数组。它们在处理...

    Oracle PL SQL 编程第5班

    5. **游标**:在处理大量数据时,游标允许我们逐行处理结果集,它是PL/SQL中处理数据库查询结果的重要工具。 6. **存储过程与函数**:存储过程是一组预编译的SQL和PL/SQL语句,可以提高性能并减少网络流量;函数则...

    Oracle EBS 开发笔记

    - **PL/SQL过程调用表示法**:调用存储过程的方法。 - **PL/SQL函数返回多行**:返回集合数据。 - **PL/SQL调用Java类**:结合Java代码增强PL/SQL的功能。 - **PL/SQL异常机制**:处理运行时错误。 - **PL/SQL...

    ORACLE8 PLSQL程序设计

    7. **存储过程与函数**:存储过程是一组可重复使用的PL/SQL代码,可以在数据库中存储和调用。函数则返回一个值,常用于计算和业务逻辑。 8. **触发器**:触发器是在特定数据库事件(如INSERT、UPDATE、DELETE)发生...

    Oracle 笔记.docx

    - **调用函数与过程**:通过PreparedStatement执行存储过程或函数。 - **DAO封装**:Data Access Object模式,封装数据访问逻辑。 以上内容涵盖了Oracle数据库的基础知识、核心概念以及相关技术和操作要点,旨在...

    Oracle-ERP开发笔记

    这通常涉及到传递参数和控制流程。 **28. FORM遍历数据块** - 遍历数据块是处理大量数据时常用的技术。这可以通过编写循环代码来实现。 **29. Form实现复制上条记录** - 一种常见的需求是在表格中快速复制上一条...

    Oracle PL SQL编程 第4版.rar

    4. **游标**:利用游标处理单行或多行结果集,进行迭代操作,以实现更灵活的数据处理。 5. **表和记录类型**:定义并使用记录类型来处理表格数据,以及如何操作嵌套表和关联数组。 6. **动态SQL**:使用EXECUTE ...

    ORALCE PL/SQL程序设计第五版

    10. **数据库连接和调用接口**:PL/SQL可以与其他编程语言(如Java、C++)交互,通过Oracle Call Interface (OCI)或JDBC调用PL/SQL过程,实现跨平台的数据访问和处理。 通过《ORACLE PL/SQL程序设计第五版》,你将...

Global site tag (gtag.js) - Google Analytics