传数组参数到存储过程

    /**
     * 调用存储过程批量插入照片
     * @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;

 

 

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

猜你喜欢

转载自563432906.iteye.com/blog/2241656