精华内容
下载资源
问答
  • 2020-04-11 14:52:28

    //因为数据库中新增了一列basic_sort ,然后需要根据之前basic_datetime数据中的时间转为时间戳后存入新增的字段中,因为表中数据量有10万+,所以网上查了查写了个存储过程出来,测试通过,10万多条用时不到2分钟

     

    我发现复制存储过程的时候有个坑,完整复制过去之后有的地方会报错,报错的位置照着手打一遍就可以了

    1. 首先先创建一个存储过程

    create procedure update_sort()
    begin

    end

     

    2. 提示成功之后将下面的内容放入begin  和  end之中

    DECLARE basic_id VARCHAR(32);
    DECLARE basic_datetime VARCHAR(32);
    # 设置变量s来进行while循环
    DECLARE s int DEFAULT 0;

    #设置consume游标,来接收查询的list的结果集
    DECLARE consume  CURSOR FOR SELECT a.basic_id as basic_id,a.basic_datetime as basic_datetime from basic a ;
    # 当程序发生异常时将s设置为1
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;
    #打开consume游标进行程序的调用
     OPEN consume;
     #将consume的内容赋值给basic_id,basic_datetime;
        FETCH consume into basic_id,basic_datetime;
        while s <> 1 DO
                  update basic b set b.basic_sort = UNIX_TIMESTAMP(basic_datetime) where b.basic_id = basic_id; 
        FETCH consume INTO basic_id,basic_datetime;
        end WHILE;
      CLOSE consume;

    更多相关内容
  • 项目中调用存储过程中传参-List类型详解

    前言:

            方向: java - Spring MVC -MyBatis - SQL存储过程

            实战目标:MyBatis调用存储过程传入List集合类型的数据进行添加操作;

            案例必备小知识:

                    Spring MVC , MyBatis , MySQL存储过程;

    实战在线:

            1.List集合类型接收页面的数据:

             2.集合类型预处理(将List集合类型转换为字符串类型):

             3.MySQL中创建存储过程:

    -- 存储过程中进行批量添加
    
    create PROCEDURE addUserList(in arrayStr varchar(255), in delimiter varchar(255))
    BEGIN
    	declare i int default 0;
    	
    	set @arrayLength = 1 + (length(arrayStr) - length(REPLACE(arrayStr,delimiter,'')));
    	
    	while i < @arrayLength
    
    	DO
    
    	set i = i+1;
    	
    	set @result = REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(arrayStr,delimiter,i)),delimiter,1));
    
    -- 	添加语句
    -- 	位置截取:SUBSTRING_INDEX(SUBSTRING_INDEX(@result,',',1),',',-1)
      insert into d_user(uname,pwd,`status`) values (SUBSTRING_INDEX(SUBSTRING_INDEX(@result,',',1),',',-1),SUBSTRING_INDEX(SUBSTRING_INDEX(@result,',',2),',',-1),0);
    
      end while;
    
    END
    
    drop PROCEDURE addUserList
    
    -- 存储过程测验
    call addUserList("小小英,123-小mei美,222","-");

             4.MyBatis调用存储过程进行添加:

    <insert id="addUserList" statementType="CALLABLE">
            {
                call addUserList(#{arrayStr},#{delim})
            }
    </insert>

     小结:

            1.MySQL存储过程中传入List集合类型时需要预先转化成字符串,以字符串形式传参;

            2.存储过程中可以先循环数组再进行sql操作即可(注意截取);

            3.存储过程中传集合类型并不常用,在做批量数据处理是可以调用处理;

            4存储过程中若需要进行复杂操作是可以创建临时表,在数据表基础上操作会更方便.

    声明:

            此文内容已进过测试可用,若有问题请及时联系小编;

            此文仅支持交流学习之用,不支持用作它途,欢迎大家交流指正;

    展开全文
  • List<Map<String,Object>> minuteSum(@Param("tableName") String tableName,@Param("dayTime") Date dayTime); Mapper <resultMap type="java.util.HashMap" id="resultMapMinute"> <result...

    Dao

    List<Map<String,Object>> minuteSum(@Param("tableName") String tableName,@Param("dayTime") Date dayTime);
    

    Mapper

    <resultMap type="java.util.HashMap" id="resultMapMinute">
        <result column="value" property="value" javaType="java.lang.Double" jdbcType="DOUBLE"/>
        <result column="time" property="time" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
    </resultMap>
    
    <select id="minuteSum" resultMap="resultMapMinute" statementType="CALLABLE">
        {CALL etl_minute_sum(#{tableName,mode=IN},#{dayTime,mode=IN})}
    </select>
    

    效果

    在这里插入图片描述

    展开全文
  • oracle调用存储过程传递list参数

    千次阅读 2018-05-04 14:53:41
    (一)jdbc连接:--第一步,创建数据库对象 CREATE OR REPLACE TYPE param_object is object( configId nvarchar2(64), evaluateScore number(18,2), ... --第二步,创建数据库list并且与数据库对象挂关系 c...

    (一)jdbc连接:

    --第一步,创建数据库对象  
    CREATE OR REPLACE TYPE param_object is object(  
      configId nvarchar2(64),  
      evaluateScore number(18,2),  
      evaluateLevel nvarchar2(64)  
    );   
      
      
    --第二步,创建数据库list并且与数据库对象挂关系  
    create type param_array as table of param_object;  
      
      
    --第三步,创建存储过程将list<object>  
    create or replace procedure PRO_UPDATE_EVALUATE_SCORE(paramList in param_array,  
                                                          result_id out varchar2) is  
    begin  
      for i in 1 .. paramList.count loop  
        update SCM_TEST  
           set CONFIGID      = paramList(i).configId,  
               EVALUATESCORE = paramList(i).evaluateScore where  
               EVALUATELEVEL = paramList(i).evaluateLevel;  
               result_id := i;  
      end loop;  
      commit;  
    end PRO_UPDATE_EVALUATE_SCORE;  




    [java] view plain copy
    package com.atguigu.springdata.test;  
      
    import java.sql.Connection;  
    import java.sql.DriverManager;  
    import java.sql.SQLException;  
    import java.sql.Types;  
    import java.util.ArrayList;  
    import java.util.Date;  
    import com.sun.org.apache.xerces.internal.impl.dtd.models.DFAContentModel;  
      
    import oracle.jdbc.OracleCallableStatement;  
    import oracle.sql.ARRAY;  
    import oracle.sql.ArrayDescriptor;  
    import oracle.sql.STRUCT;  
    import oracle.sql.StructDescriptor;  
      
    public class Tesst {  
        // 数据库连接  
        private static final String connectionURL = "jdbc:oracle:thin:@127.0.0.1:1521/oracle11g";  
        private static final String userID = "oracle11g";  
        private static final String userPassword = "oracle11g";  
        private static final String driver_class = "oracle.jdbc.driver.OracleDriver";  
      
        public void runTest() {  
            //组装需要的参数List<String[]> String[] length 要和数据库的自定对象PARAM_OBJECT个数一样  
            String chars = "abcdefghijklmnopqrstuvwxyz";  
            ArrayList list = new ArrayList<>();  
            for(int i=0;i<2000;i++){  
                String c = chars.charAt((int)(Math.random() * 26))+"";  
                String[] values = { i + 1 + "", i + 1 + "",c.toUpperCase()};  
                list.add(values);  
            }  
                 
                 
            Connection con = null;  
            OracleCallableStatement stmt = null;  
            try {  
                Class.forName(driver_class).newInstance();  
                con = DriverManager.getConnection(connectionURL, userID,  
                        userPassword);  
                  
                ARRAY aArray = getArray(con, "PARAM_OBJECT","PARAM_ARRAY", list,11);  
                  
                System.out.println("开始时间:"+  new Date());  
                stmt = (OracleCallableStatement) con.prepareCall("{call PRO_UPDATE_EVALUATE_SCORE(?,?)}");  
                  
                stmt.setARRAY(1, aArray);  
    //          stmt.setArray(1, aArray);  
                stmt.registerOutParameter(2, Types.VARCHAR);  
                  
                stmt.execute();  
                String string = stmt.getString(2);  
                System.out.println("结束时间:"+  new Date());  
                System.out.println("输出参数:"+string);  
            } catch (SQLException e) {  
                e.printStackTrace();  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {  
                if (stmt != null) {  
                    try {  
                        stmt.close();  
                    } catch (SQLException e) {  
                        e.printStackTrace();  
                    }  
                }  
                if (con != null) {  
                    try {  
                        con.close();  
                    } catch (SQLException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
      
        /** 
         * 将java数组转换成数据库数组 
         * @param con           原生jdbc链接,链接池的链接不行 
         * @param OracleObj     数据库自定义对象 
         * @param Oraclelist    数据库自定义数组 
         * @param objlist       需要的参数 
         * @param paramNum      自定义对象的个数 
         * @return   
         * @throws Exception 
         */  
        private ARRAY getArray(Connection con, String OracleObj,  
      
        String Oraclelist, ArrayList objlist,int paramNum) throws Exception {  
      
            ARRAY list = null;  
      
      
            if (objlist != null && objlist.size() > 0) {  
      
                StructDescriptor structdesc = StructDescriptor.createDescriptor(OracleObj,con);  
                  
                STRUCT[] structs = new STRUCT[objlist.size()];  
      
                Object[] result = new Object[0];  
      
                for (int i = 0; i < objlist.size(); i++) {  
                    Object[] object = (Object[]) objlist.get(i);  
                    String[] str = (String[]) objlist.get(i);  
                      
                    result = new Object[paramNum];  
      
                    // 数组大小应和你定义的数据库对象(AOBJECT)的属性的个数  
                    for(int j=0;j<paramNum;j++){  
                        result[j] = str[j];  
                    }  
      
                    // 将list中元素的数据传入result数组 result[1] = new Integer(..); //  
                    structs[i] = new STRUCT(structdesc, con, result);  
                }  
      
                ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,  
                        con);  
      
                list = new ARRAY(desc, con, structs);  
            }  
      
      
            return list;  
      
        }  
      
        public static void main(String[] args) {  
            Tesst testListToProcedure = new Tesst();  
            testListToProcedure.runTest();  
        }  
      
    }  


    注:自定义对象里面的字符必须要使用nvarchar2,不然java代码将字符串的格式封装不进去。链接要使用jdbc原生链接(Connection)才能对自定义对象和数组的转换,使用链接池转换不过来。如果谁使用了连接池成功了麻烦您评论下如何操作的,谢谢!



    (2)oracle  mybatils调用

    1.Controller层:

    // 读取解析Excel,并判断是否解析成功
    List<String[]> list = ReadExcel.batchimport(file);
    List list1 = new ArrayList<Budgetinfo>();
    int size = list.size();
    if(size>1){
    for(int i=1;i<size;i++){
    String [] obj = list.get(i);
    Budgetinfo budgetinfo=new Budgetinfo();
    budgetinfo.setCreaty(obj[0]); // 年份
    if(!StringUtil.isEmpty(obj[1])){
    budgetinfo.setCreatm(Integer.parseInt(obj[1])); // 月份
    }
    budgetinfo.setOneOrgname(obj[2]); // 所属组织
    budgetinfo.setOneSubjectname(obj[3]); // 一级科目
    budgetinfo.setTwoSubjectname(obj[4]); // 二级科目
    budgetinfo.setThreeSubjectname(obj[5]); // 三级科目
    budgetinfo.setFourSubjectname(obj[6]); // 四级科目
    if(!"0.0".equals(obj[7])){
    budgetinfo.setBudget(Double.parseDouble(obj[7])); // 预算金额
    }
    budgetinfo.setCreatetor(user.getStaffname()); // 创建人

    list1.add(budgetinfo);
    budgetinfo = null;
    }
    //调用存储过程
    HashMap<String,Object> map = new HashMap<String,Object>();
    map.put("arr",list1);

    res = service.importData(map);

    2.dao层:

    public BaseArgument importData(HashMap<String, Object> map) {
    BaseArgument res=new BaseArgument();
    getSqlSession().selectOne("BudgetinfoMapper.importExcelData", map);
    return res;

    }

    3.XML代码:

    <parameterMap type="java.util.Map" id="inputMap">  
            <parameter property="arr" jdbcType="ARRAY"  
                javaType="java.util.List" mode="IN" typeHandler="com.ydtx.comm.ListHandler"/>  
            <parameter property="v_out" jdbcType="VARCHAR"  
                javaType="java.lang.String" mode="OUT" />  

      </parameterMap> 

    <!-- 调用存储过程导入excel数据 -->
    <select id="importExcelData" statementType="CALLABLE" parameterMap="inputMap">
    {call sp_loaddata(?,?)} 

    </select>

    3.对传入的List集合做处理的类

    package com.ydtx.comm;


    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;


    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;


    import com.ydtx.bean.pojo.payBudget.Budgetinfo;
    import com.ydtx.utils.StringUtil;


    import oracle.sql.ARRAY;
    import oracle.sql.ArrayDescriptor;
    import oracle.sql.STRUCT;
    import oracle.sql.StructDescriptor;


    public class ListHandler extends BaseTypeHandler{
      
        @SuppressWarnings("unchecked")  
        @Override  
        public void setNonNullParameter(java.sql.PreparedStatement parameterSetter, int i,  
                Object o, JdbcType jdbcType) throws SQLException {  
            Connection conn = null;  
            try {  
                if(null != o){  
                    List<Budgetinfo> list = (ArrayList<Budgetinfo>) o;  
                    conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.16:1521:oracle", "CWSYS", "CWSYS");  
                    //这里必须得用大写,而且必须要引入一个包,如果不引入这个包的话字符串无法正常转换,包是:orai18n.jar  

                    ARRAY array = getArray(conn, "USEROBJ", "OBJ_ARRAY", list);  //USEROBJ表示数据库自定义对象, OBJ_ARRAY表示数据库自定义数组
                    parameterSetter.setArray(i, array);  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally{  
                if(null != conn){  
                    conn.close();  
                }  
            }  
              
        }  
          
        @SuppressWarnings("rawtypes")  
        private ARRAY  getArray(Connection con,String OracleObj, String Oraclelist, List<Budgetinfo> listData) throws Exception {  
            ARRAY array = null;  
            ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, con);  
            STRUCT[] structs = new STRUCT[listData.size()];  
            if (listData != null && listData.size() > 0){  
                StructDescriptor structdesc = new StructDescriptor(OracleObj, con);  
                for (int i = 0; i < listData.size(); i++){  
                    Object[] result = {
                    listData.get(i).getCreaty(), // 年份
                    listData.get(i).getCreatm(), // 月份
                    listData.get(i).getOneOrgname(), // 所属组织
                    listData.get(i).getOneSubjectname(), // 一级科目
                    listData.get(i).getTwoSubjectname(), // 二级科目
                    listData.get(i).getThreeSubjectname(), // 三级科目
                    listData.get(i).getFourSubjectname(), // 四级科目
                    listData.get(i).getBudget(), // 预算金额
                    listData.get(i).getCreatetor()
                    };  
                    structs[i] = new STRUCT(structdesc, con, result);  
                }  
                array = new ARRAY(desc, con, structs);  
            }else{  
                array = new ARRAY(desc, con, structs);  
            }  
            return array;  
        }


    @Override
    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
    // TODO Auto-generated method stub
    return null;
    }


    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    // TODO Auto-generated method stub
    return null;
    }


    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    // TODO Auto-generated method stub
    return null;
    }

    }


    展开全文
  • Java执行Oracle存储过程接收多个返回值(集合/数值)Java代码:package com.pure.util;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;...
  • 接收存储过程返回的多个结果集 Exam表结构 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for exam -- ---------------------------- DROP TABLE IF ...
  • @Select("call pro_work_order_item( #{mastId,mode=IN,jdbcType=NUMERIC}," + " #{pPage,mode=IN,jdbcType=NUMERIC}," + " #{pCount,...
  • Java调用带参数的Oracle 存储过程并返回集合,
  • 原文链接:https://blog.csdn.net/eeeeasy/article/details/80999650?utm_source=blogxgwz2在项目中遇到一个问题,想要封装一个通用的可接收任意类型的List对象的方法,最开始以为很容易实现,通过List就可接收任意...
  • navicate创建mysql存储过程,同时需要对存储过程中的查询list结果集进行遍历,获取相应的结果参数执行其他的业务逻辑; 存储过程可定义事件定时器,定时执行函数,具体操作可见另一篇博文:navicate创建mysql存储...
  • 存储过程的导入List集合

    千次阅读 2017-08-09 11:02:44
    这个存储过程在package中,以下是包中的详细代码,下面的代码包含伪代码,请结合实际进行参考 object的创建代码: craate or repalce type tanglei_lianxi_obj is object(  -- 列名  id number,  name varchar, ...
  • 初次学习存储过程调用,写得不是很好,有不对的地方大家多多指教,希望能对您有所帮助。1.普通返回值:Oracle存储过程:/*测试用存储过程*/create or replace procedure p_test(v_slid in varchar2,v_sm out varchar...
  • oracle存储过程接收自定义数组类型参数 2016年10月29日 09:53:23 ntuloser 阅读数:1092 标签: oraclejava存储mybatis 更多 个人分类: 数据库 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...
  • JAVA执行存储过程接收返回值

    千次阅读 2014-04-09 11:31:44
    List result = new ArrayList();//接收值所用的列表 Connection conn = DAOFactory.getDAOFactory().getConnection();//根据项目情况打开连接(这里只是我项目的打开方式) CallableStatement statement = conn....
  • 实体类中有个List存储其他实体类,想通过@RequestBody进行同步的,但老是同步不了 关于@RequestBody同步List类型等其他类型入参为null问题解决办法: 1.查看是否使用@Data的getset方法,由于lombook生成的getset方法...
  • 接收一个List作为入参的话不报错,下方为代码:前台:$.ajax({type:"post",url: 'add',contentType:"application/json; charset=utf-8",dataType:"json",data:JSON.stringify([{id:1,name:"hello"},{id:2,name:...
  • Mysql存储过程调用

    千次阅读 2021-01-19 00:34:07
    1.1create procedure (创建)create procedure存储过程名 (参数列表)beginsql语句代码块end注意:由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个in参数。要指定为其它...
  • 使用存储过程查询数据库,返回了多个结果集,需要使用java接收和处理。并且展示到前端页面 二.环境: springboot+mybatis 数据库:sqlServer 三.解决过程存储过程: <!--返回结果集的配置--> <...
  • 在使用oracle进行批量插入的时,如果数据量较小可以使用install all的语法进行批量插入。... 使用存储过程批量插入很显然要接收一个数组当参数,而且这个数组里的元素类型应该和java里自定义的数据模型对应。
  • java如何将一个List传入Oracle存储过程

    千次阅读 2015-07-16 14:16:16
    java如何将一个List传入Oracle存储过程,例子如下: 数据库端建一个PL/SQL的数组。 CREATE OR REPLACE TYPE tables_array AS VARRAY(100) OF VARCHAR2(32) ; drop table test purge; create table test ( name ...
  • mybatis调用存储过程返回游标接收结果集。 详细信息 1.service实现类 @Override @Transactional public List<HighgoFunOneRefcursorEntity> getOneRefcursor(Integer id) { HashMap<S
  • 存储过程处理json数据

    千次阅读 2021-05-05 09:48:24
    后台对象集合转换为json数据作为存储过程的入参,处理方式如下:create or replace procedure SP_KHZBDFB_UPDATE(p_json IN VARCHAR2, --传入的json串p_code OUT NUMBER, --结果代码p_message OUT VARCHAR2) is --...
  • oracle没有直接的返回List的方法,这里需要有包定义一个Cursor(游标)的返回类型。下面是我在计算收益率的一段代码,只做参考。 oracle包的写法如下: CREATE OR REPLACE PACKAGE CAL_RTN_PACK IS    ...
  • List接收或返回多种List参数类型

    千次阅读 2019-07-23 18:34:31
    List<?>范型,范型通配符的使用<?>,`?`是类型实参,而不是类型形参,此处的`?`和Number、String、Integer一样都...一般作为参数来接收外部集合,或者返回一个具体元素类型的集合。 一个应用例子: publ...
  • list类型的参数,接收前台的数组值,实验了一下,结果还真可以。不用绑定到对象里面。当然我这个是前台传递了个包含的是string的数组到后台,然后,后台用list接收。具体如下:前台代码://发送请求到后台,带数组...
  • SpringMVC用List接收请求参数

    千次阅读 2018-11-26 22:13:12
    list类型的参数,接收前台的数组值,实验了一下,结果还真可以。 不用绑定到对象里面。 当然我这个是前台传递了个包含的是string的数组到后台,然后,后台用list接收。 具体如下: 前台代码: //发送请求到后台...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 242,736
精华内容 97,094
关键字:

存储过程接收list