`

传数组参数到存储过程

 
阅读更多
    /**
     * 调用存储过程批量插入照片
     * @param jwxhs 照片名字(不带后缀)数组集合,也就是学生教务学号集合(eg.123 不是123.jpg)
     * @param undirectoryPath 照片对应的文件夹路径
     */
    private void synaZp(String[] jwxhs, String undirectoryPath) {
        CallableStatement stmt = null;
        //本地学工系统存储器调用处理
        XsxxglAMImpl am = (XsxxglAMImpl) ADFUtils.getApplicationModuleForDataControl("XsxxglAMDataControl");
        Connection cn;
        try {
            cn = am.getDBTransaction().createStatement(0).getConnection();
            //定义数据库中对象数组类型
            ArrayDescriptor desc = ArrayDescriptor.createDescriptor("TYPE_JWXH_VARCHAR2", cn);
            String batchSQL = "begin xjxxgl_syncZp(?, ?, ?); end;";
            stmt = am.getDBTransaction().createCallableStatement(batchSQL, 0);
            ARRAY jwxh_RXNY = new ARRAY(desc, cn, jwxhs);
            stmt.setObject(1, jwxh_RXNY);
            stmt.setObject(2, undirectoryPath);
            stmt.registerOutParameter(3, Types.NUMERIC);
            stmt.execute();
            System.out.println("导入数量:"+stmt.getString(3));
            if (!stmt.getString(3).equals("0")) {
                am.getDBTransaction().commit();
            }
            JSFUtils.addFacesInformationMessage("导入完成,共导入" + stmt.getString(3) + "条图片");
        } catch (java.sql.SQLException s) {
            s.printStackTrace();
            throw new oracle.jbo.JboException(s);
        } catch (Exception e) {
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (java.sql.SQLException s2) {
                throw new oracle.jbo.JboException(s2);
            }
        }
    }

 需要定义数据库中的数组类型;

Connection cn;

cn = am.getDBTransaction().createStatement(0).getConnection();

            //定义数据库中对象数组类型
            ArrayDescriptor desc = ArrayDescriptor.createDescriptor("TYPE_JWXH_VARCHAR2", cn);

            ARRAY jwxh_RXNY = new ARRAY(desc, cn, jwxhs);
            stmt.setObject(1, jwxh_RXNY);

-----------

jwxhs为字符串的数组;

create or replace procedure xjxxgl_syncZp(p_jwxhs IN TYPE_JWXH_VARCHAR2,
                                          p_path  IN VARCHAR2,
                                          p_count out NUMBER) is

  /**
  *  学生照片批量插入

  *  2015年9月7日
  
  p_jwxhs 学生学号字符串数组集
  p_path  照片存放的文件夹路径
  p_count 统计插入照片条数
  */
  TYPE XSCUR IS REF CURSOR; --定义类型变量
  CUR_XS XSCUR; --引用游标的数据类型
  --这种变量通常用于存储过程和函数返回结果集时使用,
  --因为PL/SQL不允许存储过程或函数直接返回结果集,但可以返回类型变量,
  --于是引用游标的类型变量作为输出参数或返回值

  XSTEMP_XH VARCHAR2(30);
  count_start number;  --记录批量插入前数量
  count_end   number;  --记录批量插入后数量

BEGIN
  select count(*) into count_start from xsxxgl_xsjbxx WHERE zppath is not null;
  FOR I in p_jwxhs.first .. p_jwxhs.last LOOP
  
    OPEN CUR_XS FOR
      SELECT xs.jwxh
        FROM xsxxgl_xsjbxx xs
       WHERE xs.jwxh = p_jwxhs(I)
         and xs.zppath is null;
    FETCH CUR_XS
      INTO XSTEMP_XH;
  
    --判断学生照片是否为空,如果为空插入新的照片路径,不为空则不操作
    IF CUR_XS% FOUND THEN
      --如果学生照片为空则插入
      --用户信息表
      UPDATE xsxxgl_xsjbxx YH
         SET YH.Zppath = '/imageservlet?path='||p_path||'/'||p_jwxhs(I)||'.jpg'
       WHERE YH.Jwxh = p_jwxhs(I);
    END IF;
  
    CLOSE CUR_XS;
  END LOOP;
  --统计插入数量
  select count(*) into count_end from xsxxgl_xsjbxx WHERE zppath is not null;
  p_count := count_end - count_start;

exception
  when others then
    raise;
    rollback;
END xjxxgl_syncZp;

 

 

-------功能摘自学工系统,学生信息管理,照片批量上传

 

分享到:
评论

相关推荐

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

    当我们谈论`Spring`访问传入数组参数的`Oracle`存储过程时,我们实际上是在探讨如何利用Java的Spring框架与Oracle数据库进行高级交互。Spring是一个广泛使用的开源框架,它简化了企业级Java应用的开发,而Oracle...

    在SQL存储过程中进行参数数组Array Parameter的处理函数

    总的来说,虽然SQL Server不直接支持数组参数,但通过上述方法,我们可以在存储过程中有效地处理批量数据。在选择方法时,应考虑数据量、性能需求以及安全性等因素。在实际应用中,根据项目需求和环境,选择最合适的...

    一个基于SQL server 2005实现的通过一个数组参数进行Procedure的parameter传递例子

    在这个特定的例子中,我们将探讨如何通过一个数组参数来传递数据给存储过程,这对于处理批量操作或者一组相关的数据非常有用。 1. **数组参数的概念**: 在SQL Server中,我们不能直接定义一个数组类型的参数。...

    oracle class12.jar nls_charset12.jar存储过程接收数组空值

    在处理存储过程时,尤其是涉及到数组参数时,这两个库可能会起到关键作用。 在Oracle中,数组类型主要有两种:PL/SQL类型的数组和Oracle的Collection类型。PL/SQL类型的数组是定义在PL/SQL块内的,而Oracle ...

    oracle数组存储过程批量插入

    Oracle数据库支持通过数组参数来进行批量操作,这在处理大量数据时能显著提高性能。在本例中,我们探讨了如何使用数组存储过程进行批量插入和删除。数组在Oracle中的使用通常涉及定义PL/SQL类型,这允许我们创建索引...

    java调用存储过程返回数组

    例如,对于输出参数为自定义数组的存储过程`make_logincard_pro`,你需要使用`OracleCallableStatement`的`setArray`和`getArray`方法来设置和获取数组参数。在调用存储过程之前,需要将Java中的数组转换为`Oracle...

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

    以上就是Java调用Oracle带参数存储过程并处理返回集合的基本流程。注意在实际开发中,我们还需要考虑异常处理,资源关闭,以及可能的事务管理等细节。 在处理数组参数时,Oracle提供了PL/SQL TABLE类型的参数,Java...

    Mybatis调用PostgreSQL存储过程实现数组入参传递

    对于数组参数,我们需要自定义一个`TypeHandler`来处理`int[]`类型。这可以通过实现`TypeHandler`接口或继承`BaseTypeHandler`类完成。例如,我们可以创建一个`IntArrayTypeHandler`,重写`setParameter`和`get...

    oracle存储过程返回多行多列的结构化数组,java调用并解析

    在Oracle数据库中,存储过程是预编译的SQL和PL/SQL代码集合,它们可以接收输入参数、执行复杂的业务逻辑并返回结果。当需要返回的数据不仅仅是单行单列时,可以使用结构化数组来实现多行多列的结果。Java作为常用的...

    c语言数组参数最大值最小值

    总的来说,C语言数组参数最大值最小值的程序是理解和实践数组操作的一个好例子,它涉及到基本的循环、条件判断以及指针的使用,这些都是C语言编程的基础技能。对于初学者来说,不断编写这样的小程序并分享给他人可以...

    c# 调用带参数的存储过程

    该方法接收连接对象、存储过程名称和参数数组作为输入,创建一个`SqlCommand`对象,并将其命令类型设置为`CommandType.StoredProcedure`,表示这是一个存储过程调用。接着遍历参数数组,将每个参数添加到`SqlCommand...

    jquery ajax 向后台传递数组参数示例

    特别是,当需要传递数组参数时,如果数组中包含对象类型的数据,直接传递可能会遇到问题,如在后台接收到的仅是"[object Object]"这样的字符串。本文将详细解释这种情况的原因,并提供相应的解决方法。 首先,我们...

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

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

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

    在完成Java集合到Oracle数组的转换后,接下来是实际调用存储过程的过程。这通常通过`CallableStatement`接口完成,其中使用`setARRAY`方法将转换后的数组设置为参数。 ```java public static int updateADInfo...

    oracle数组存储过程批量插入.pdf

    通过创建一个存储过程,使用数组作为参数来传递大量数据,然后在存储过程中进行批量插入操作。 首先,需要创建一个类型来定义数组,这个类型可以用来存储大量数据。在本文中,创建了一个名为 MSG_ARRAY 的类型,这...

    oracle数组存储过程批量插入.docx

    在C#代码中,使用`OracleCommand`创建了一个命令对象,设置其命令类型为存储过程,并通过`OracleParameter`来传递数组参数。 在Java环境中,批量插入数据的处理方式略有不同。首先,需要在数据库中创建一个对象类型...

    C# 传入自定义列表List 到Oracle存储过程

    在Oracle数据库中,创建一个接受数组作为参数的存储过程。假设我们有一个自定义类型`MY_TYPE`,它包含两个字段,如ID(NUMBER类型)和NAME(VARCHAR2类型),则存储过程可能如下: ```sql CREATE OR REPLACE ...

    存储过程不支持数组类型的变通办法

    本文将深入探讨存储过程在处理批量删除操作时面临的问题,以及如何通过变通方法解决在SQL Server 2005中存储过程不支持数组类型参数的限制。 在早期的项目中,比如使用ASP开发网上商城与Access数据库配合,批量删除...

    dll向C#传递数组.rar

    通过以上步骤,我们可以成功地在C#中调用C++ DLL并传递数组参数。这个示例“dll向C#传递数组.rar”提供了一个实践的例子,帮助开发者理解这一过程。在实际开发中,根据具体需求调整和优化这些技术,以达到最佳效果。

Global site tag (gtag.js) - Google Analytics