`
talentluke
  • 浏览: 600863 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java中传入数组调用oracle存储过程

 
阅读更多

数据库部分:

-----------------------------------------------------------------------------------------------------------------

为了保证写出来的都是可以运行的,所以每次创建表、类型等等,都先drop一下。第一次运行的朋友,可能会发现drop语句报×××不存在,可以忽略。引号

drop table T_VarcharArray;
create table T_VarcharArray(
    id number(10),
    name varchar2(100)
    );

drop type T_VARCHAR;

--创建一个与T_VarcharArray的name同类型的不定长数组的引定义
create or replace type T_VARCHAR as table of varchar2(100); 
/

drop type T_NUMBER;

--创建一个与T_VarcharArray的id同类型的不定长数组的定义
create or replace type T_NUMBER as table of number(10);
/

create or replace procedure P_VARCHAR2_LST(
    i_t_varchar IN t_varchar, --输入参数为定义的不定长varchar2数组
    o_n_ret OUT number --输出参数,正常结束,则输出0,否则抛出异常
    )
is
begin
    FOR i in 1..i_t_varchar.COUNT loop --注意下标从1开始。
        insert into T_VarcharArray values (i,i_t_varchar(i));
    end loop;
    o_n_ret :=0;
    exception when others then
    raise;
end;
/

create or replace function F_NUMBER_LST(
    i_t_number IN t_number --输入参数为定义的不定长数值数组
    )
return number --函数输出结果
is
begin
    FOR i in 1..i_t_number.COUNT loop --注意下标从1开始。
        insert into T_VarcharArray values (i_t_number(i),to_char(i));
    end loop;
    return 0;
    exception when others then
    raise;
end;

 

 

Java部分:

-----------------------------------------------------------------------------------------------------------------------------------------------

 

package test.oracle.oj;   
import java.sql.*;   
import oracle.jdbc.driver.OracleTypes;   
import oracle.sql.ARRAY;   
import oracle.sql.ArrayDescriptor;   
import test.oracle.conn.OConnection;   
public class Varchar2NumberArray {   
    // 注意:T_VARCHAR2必须全部大写   
    private static final String T_VARCHAR = "T_VARCHAR";   
    private static final String T_NUMBER = "T_NUMBER";   
    // 注意:call必须小写,过程名字必须全部大写   
    private static final String P_VARCHAR2_LST = "{call P_VARCHAR2_LST(?,?)}";   
    // 注意:call必须小写,过程名字必须全部大写,返回值在java中是第一个   
    private static final String F_NUMBER_LST = "{? = call F_NUMBER_LST(?)}";   
    public static int varchar2LstTest(String[] lst) {   
        int retVal = -1;   
        Connection con = null;   
        CallableStatement cstmt = null;   
        try {   
            con = OConnection.getConn();   
            // 创建一个数组描述符   
            ArrayDescriptor varchar2Desc = ArrayDescriptor.createDescriptor(   
                    T_VARCHAR, con);   
            // 将字符串数组转换为oralce能识别的数组   
            ARRAY vArray = new ARRAY(varchar2Desc, con, lst);
   
            cstmt = con.prepareCall(P_VARCHAR2_LST);   
            cstmt.setArray(1, vArray);   
            cstmt.registerOutParameter(2, OracleTypes.INTEGER);   
            cstmt.execute();   
            retVal = cstmt.getInt(2);   
        } catch (Exception ex) {   
            ex.printStackTrace();   
        } finally {   
            // 最好都在finally里面关闭用到的cs、ps、rs以及con,   
            // 以确保出异常时,该释放的都被释放   
            try {   
                if (cstmt != null) {   
                    cstmt.close();   
                }   
                if (con != null) {   
                    con.close();   
                }   
            } catch (SQLException sqle) {   
                sqle.printStackTrace();   
            }   
        }   
        return retVal;   
    }   
    public static int numberLstTest(int[] lst) {   
        int retVal = -1;   
        Connection con = null;   
        CallableStatement cstmt = null;   
        try {   
            con = OConnection.getConn();   
            // 创建一个数组描述符   
            ArrayDescriptor varchar2Desc = ArrayDescriptor.createDescriptor(   
                    T_NUMBER, con);   
            // 将字符串数组转换为oralce能识别的数组   
            ARRAY vArray = new ARRAY(varchar2Desc, con, lst);   
            cstmt = con.prepareCall(F_NUMBER_LST);   
            // 返回值在java中是第一个,所以先注册输出参数   
            cstmt.registerOutParameter(1, OracleTypes.INTEGER);   
            cstmt.setArray(2, vArray);   
            cstmt.execute();   
            retVal = cstmt.getInt(1);   
        } catch (Exception ex) {   
            ex.printStackTrace();   
        } finally {   
            // 最好都在finally里面关闭用到的cs、ps、rs以及con,   
            // 以确保出异常时,该释放的都被释放   
            try {   
                if (cstmt != null) {   
                    cstmt.close();   
                }   
                if (con != null) {   
                    con.close();   
                }   
            } catch (SQLException sqle) {   
                sqle.printStackTrace();   
            }   
        }   
        return retVal;   
    }   
    public static void main(String[] args) throws Exception {   
        String[] lst = { "test1", "test2", "test2" };   
        int ret = Varchar2NumberArray.varchar2LstTest(lst);   
        System.out.println("测试字符串数组作为参数传入存储过程,结果:" + ret);   
        int[] lst1 = { 1, 2, 3 };   
        ret = Varchar2NumberArray.numberLstTest(lst1);   
        System.out.println("测试整型数组作为参数传入存储过程,结果:" + ret);   
    }   

 

如果无法将数组中数据插入到数据库中,则将oracle的nls_charset12.jar加入到工程,重新编译即可!

分享到:
评论
1 楼 hobyjoe 2012-05-04  
我导入了nls_charset12.jar导入数据库中的字符串依然为空,不知为何

相关推荐

    Spring访问传入数组参数的Oracle存储过程

    总的来说,理解如何在Spring中正确地调用Oracle存储过程并传递数组参数是提高应用程序效率和数据库操作灵活性的重要技能。这涉及到了数据库设计、Java编程、Spring框架的使用以及对Oracle特定特性的掌握。通过上述...

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

    Java调用Oracle存储过程返回结果集(Record)是指在Java程序中通过调用Oracle存储过程来获取记录集的结果。下面将详细介绍相关知识点。 创建Type 在Oracle中,需要创建两个Type类型:`myScalarType`和`myTableType...

    JAVA调用ORACLE存储过程通用类

    本篇文章将详细介绍一个用于Java应用程序中调用Oracle存储过程的通用类,帮助开发者更高效地实现相关功能。 #### 核心知识点解析 ##### 1. 类的基本结构 此通用类位于`com.gemship.common.service.impl`包下,名...

    Java调用存储过程--传入集合参数

    通过本文的探讨,我们不仅了解了如何在Java中调用Oracle存储过程并传递集合参数的基本原理,还深入实践了相关的技术细节。这对于构建高性能、高可靠性的企业级应用而言,是不可或缺的知识点。在未来,随着数据量的...

    Mybatis传list参数调用oracle存储过程的解决方法

    "Mybatis调用Oracle存储过程传List参数解决方法" Mybatis是当前最流行的持久层框架之一,它提供了强大的数据访问和操作功能。但是,如何将List类型参数传递给Oracle存储过程,实现批量插入数据却是一个棘手的问题,...

    Java调用带参数的存储过程并返回集合

    总结,Java调用Oracle存储过程涉及的关键点包括:JDBC连接,CallableStatement,输入/输出参数的设定,以及结果集的处理。理解这些知识点,能够帮助开发者有效地实现数据库操作,提升应用性能。

    oracle存储过程调用实践[文].pdf

    在软件开发中,熟练掌握Oracle存储过程的调用是必要的,因为它能提高应用程序的性能,减少网络传输,并提供更好的数据库安全性。 1. ORA-00921: unexpected end of SQL command 这个错误通常是因为SQL语句的语法不...

    oracle存储过程

    "JDBC执行Oracle传入参数为集合对象的存储过程"这个标签提示了如何通过Java的JDBC接口调用Oracle存储过程。JDBC(Java Database Connectivity)是Java语言连接数据库的标准API,它提供了多种方法来调用存储过程,...

    nls_charset12.jar oracle 10

    用java调用oracle存储过程,传入数组参数,数组项为空值。

    Hibernate3调用存储过程用法

    在Java的持久化框架Hibernate中,调用数据库的存储过程是一项常见的需求。本文将深入探讨在Hibernate3中如何实现这一功能,以及相关的知识点。 一、为什么要使用存储过程 存储过程是预编译的SQL语句集合,它们在...

    nls_charset12.jar

    描述中提到的“解决oracle11g存储过程传入数组空的问题”涉及到Oracle PL/SQL中的数组类型。在PL/SQL中,我们可以定义变量为数组类型,以便一次性处理多个值。但是,如果这些数组可能包含空值(NULL),我们需要特别...

    大学毕业论文---oracleobject设计.doc

    在论文“大学毕业论文---oracleobject设计.doc”中,作者探讨了如何在数据库设计中利用 OracleObject 实现数据表与对象的解耦,以及在 Java 应用程序中调用这些对象的方法。 首先,论文提到了三个主要的数据表:...

    oracleobject设计毕业设计论文完整版设计论文.doc

    在使用 OracleObject 时,我们需要定义 ParamValuePairList,是传入 SQL 语句或者存储过程的参数的集合,包括 SqlInParameter,SqlOutParameter。如果使用 OracleObject,我们可以轻易地传入 TradeObject 这个由 ...

    存储过程返回数组对象示例代码

    这个存储过程的使用方式是在PL/SQL代码或Java、C#等支持Oracle存储过程调用的编程语言中调用`account_month`函数,传入日期参数,并接收返回的"T_ACCOUNT_MONTH_TABLE"对象。在应用程序中,可以进一步处理这个数组...

    清华Java程序设计实例教程

    5. 数组和集合:数组是存储同类型数据的序列,而集合框架(如ArrayList、LinkedList、HashMap等)则提供了更灵活的数据存储和操作方式。 【面向对象编程】 面向对象编程(OOP)是Java的核心特性。它包括封装、继承...

    java 电子书 Adobe Acrobat Document

    ### Java 电子书知识点概述 ... - **详细解析**:在Java中,可以通过在函数定义时声明参数列表来接收传入的值。例如: ```java public static int add(int a, int b) { return a + b; } ``` - **5.3...

    java功能代码

    根据给定的文件信息,以下是对“java功能代码”中几个关键知识点的详细解析: ### 1. 向Java文件中添加文本 在Java中,向文件中添加文本通常涉及使用`BufferedWriter`和`FileWriter`类。示例代码展示了如何在不...

    jdbc批量 (绝对经典)

    在实际应用中,存储过程的批量执行通常涉及定义一个接收数组参数的存储过程,然后通过JDBC的`CallableStatement`对象调用该过程,将所有待处理的数据一次性传入。 #### 总结 JDBC的批量处理机制是提高数据库操作...

Global site tag (gtag.js) - Google Analytics