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

    //因为数据库中新增了一列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;

    展开全文
  • JAVA执行存储过程接收返回值

    千次阅读 2014-04-09 11:31:44
    List result = new ArrayList();//接收值所用的列表 Connection conn = DAOFactory.getDAOFactory().getConnection();//根据项目情况打开连接(这里只是我项目的打开方式) CallableStatement statement = conn....
    List<Object[]> result = new ArrayList<Object[]>();//接收值所用的列表
    
    Connection conn = DAOFactory.getDAOFactory().getConnection();//根据项目情况打开连接(这里只是我项目的打开方式)
    CallableStatement statement = conn.prepareCall("{call up_GetDept(?)}");//执行存储过程"?"为需传递的参数
    
    statement.setString(1, productCode);//传递参数
    
    ResultSet rs = statement.executeQuery();
    //循环拿出返回的值
    while (rs.next()) {
    	Object[] object = new Object[2];
    	object[0] = rs.getString("deptname");
    	object[1] = rs.getString("deptcode");
    
    	result.add(object);
    }
    	conn.commit();
    展开全文
  • 在使用oracle进行批量插入的时,如果数据量较小可以使用install all的语法进行批量插入。... 使用存储过程批量插入很显然要接收一个数组当参数,而且这个数组里的元素类型应该和java里自定义的数据模型对应。

    在使用oracle进行批量插入的时,如果数据量较小可以使用insert all的语法进行批量插入。如果数据量较大,再使用insert all的语句插入就会发生错误,因为这个语法会受到限制,oracle不允许一次性插入的列数乘以行数>1000,这时就可以考虑使用存储过程批量插入了。
    使用存储过程批量插入很显然要接收一个数组当参数,而且这个数组里的元素类型应该和java里自定义的数据模型对应。我项目里数据层使用的是MyBatis,就整理整理MyBatis的实现过程。当然不管是MyBatis还是Hibernatge、JDBC都是一个道理,关键的一步都是将java数据模型转换成数据库数据模型。
    以user表为例,user表字段:id、username、age、phone、email,对user表进行批量插入。思考一下,java里有个user类,批量插入,那么传入数据类型应该是List,但是数据库可不认识这个数据模型,所以为了让数据库认识,需要将java模型转换成数据库模型。

    1. 创建数据库类型和java数据模型对应
    create or replace type user_type as object(
           age number,
           username nvarchar2(20),
           phone nvarchar2(20),
           email nvarchar2(50)
    )

    注意这里字符串类型一定要定义为nvarchar,否则字符串类型在转换时会乱码无法插入数据库

    2.数据模型有了,还得有个能存放此类型的数组

    create or replace type user_type_arr as table of user_type

    3.接着可以创建存储过程了

    create or replace procedure user_insert_pro(userList in user_type_arr) as
    begin
    
      for i in 1 .. userList.count loop 
        insert into users(
                           id,
                           username,
                           age,
                           phone,
                           email
                          )
                          values
                          (
                           user_seq.nextval,
                           userList(i).username,
                           userList(i).age,
                           userList(i).phone,
                           userList(i).email
                          );
      end loop;
    end user_insert_pro;
     数据库的准备工作就完成了,下面是java代码的工作。我使用的是MyBatis,要在Mapper里配置一个parameterMap
    
    <parameterMap type="map" id="user_map">
            <parameter property="userList" javaType="java.util.ArrayList" mode="IN" jdbcType="ARRAY"
            typeHandler="com.jy.typeHandler.UserListHandler"/>
        </parameterMap>

    然后写mybatis里写存储过程调用时的参数类型就定义为这个parameterMap ,这样的意义就是配置的typeHandler会将java里传入的ArrayList转换成对应的数据库类型。UserListHandler代码如下

    package com.jy.typeHandler;
    
    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.jy.model.User;
    
    import oracle.sql.ARRAY;
    import oracle.sql.ArrayDescriptor;
    import oracle.sql.STRUCT;
    import oracle.sql.StructDescriptor;
    
    @SuppressWarnings("rawtypes")
    public class UserListHandler extends BaseTypeHandler
    {
    
        @Override
        public Object getNullableResult(ResultSet arg0, String arg1) throws SQLException
        {
            return null;
        }
    
        @Override
        public Object getNullableResult(ResultSet arg0, int arg1) throws SQLException
        {
            return null;
        }
    
        @Override
        public Object getNullableResult(CallableStatement arg0, int arg1) throws SQLException
        {
            return null;
        }
    
        @SuppressWarnings("unchecked")
        @Override
        public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object obj, JdbcType arg3)
                throws SQLException
        {
            Connection conn = null;
            try
            {
                if (null != obj)
                {
                    List<User> list = (ArrayList<User>) obj;
                    conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "root", "root");
                    // 数据库的type名必须大写
                    ARRAY array = getArray(conn, "USER_TYPE", "USER_TYPE_ARR", list);
                    preparedStatement.setArray(i, array);
                }
            } catch (Exception e)
            {
                e.printStackTrace();
            } finally
            {
                if (null != conn)
                {
                    conn.close();
                }
            }
        }
    
        private ARRAY getArray(Connection con, String OracleObj, String Oraclelist, List<User> data) throws Exception
        {
            ARRAY array = null;
            ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, con);
            STRUCT[] structs = new STRUCT[data.size()];
            StructDescriptor structdesc = new StructDescriptor(OracleObj, con);
            for (int i = 0; i < data.size(); i++)
            {
                Object[] result = { 
                                    data.get(i).getAge(), 
                                    data.get(i).getUsername(), 
                                    data.get(i).getPhone(),
                                    data.get(i).getEmail() 
                                };
                structs[i] = new STRUCT(structdesc, con, result);
            }
            array = new ARRAY(desc, con, structs);
            return array;
        }
    
    }
    

    再再Mapper里定义存储过程调用的语句

    <insert id="userInsert" useGeneratedKeys="false" parameterMap="user_map" statementType="CALLABLE">
            call user_insert_pro(?) 
        </insert>

    最后可以在java代码里用MyBatis调用存储过程了,MyBatis会基于刚才的配置,将java模型转换成数据库模型。
    调用如下:

    @org.junit.Test
        public void test()
        {
            SqlSession session=sqlSessionFactory.openSession();
            List<User> list=new ArrayList<User>();
            for(int i=0;i<1000;i++)
            {
                list.add(new User("jy", 25, "oracle.com", "110"));
            }
            HashMap<String, Object> params=new HashMap<String,Object>();
            params.put("userList", list);
            session.insert("com.jy.dao.UserDao.userInsert", params);
            session.close();
        }

    全剧终!

    不管什么框架,主要找到java模型和数据库模型转换的方式就行了

    展开全文
  • oracle存储过程接收自定义数组类型参数 2016年10月29日 09:53:23 ntuloser 阅读数:1092 标签: oraclejava存储mybatis 更多 个人分类: 数据库 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

    oracle存储过程接收自定义数组类型参数

    2016年10月29日 09:53:23 ntuloser 阅读数:1092 标签: oraclejava存储mybatis 更多

    个人分类: 数据库

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ntuloser/article/details/52962988

    在使用oracle进行批量插入的时,如果数据量较小可以使用insert all的语法进行批量插入。如果数据量较大,再使用insert all的语句插入就会发生错误,因为这个语法会受到限制,oracle不允许一次性插入的列数乘以行数>1000,这时就可以考虑使用存储过程批量插入了。 
    使用存储过程批量插入很显然要接收一个数组当参数,而且这个数组里的元素类型应该和java里自定义的数据模型对应。我项目里数据层使用的是MyBatis,就整理整理MyBatis的实现过程。当然不管是MyBatis还是Hibernatge、JDBC都是一个道理,关键的一步都是将java数据模型转换成数据库数据模型。 
    以user表为例,user表字段:id、username、age、phone、email,对user表进行批量插入。思考一下,java里有个user类,批量插入,那么传入数据类型应该是List,但是数据库可不认识这个数据模型,所以为了让数据库认识,需要将java模型转换成数据库模型。

    1. 创建数据库类型和java数据模型对应
    create or replace type user_type as object(
           age number,
           username nvarchar2(20),
           phone nvarchar2(20),
           email nvarchar2(50)
    )

    注意这里字符串类型一定要定义为nvarchar,否则字符串类型在转换时会乱码无法插入数据库

    2.数据模型有了,还得有个能存放此类型的数组

    create or replace type user_type_arr as table of user_type
    • 1

    3.接着可以创建存储过程了

    create or replace procedure user_insert_pro(userList in user_type_arr) as
    begin
    
      for i in 1 .. userList.count loop 
        insert into users(
                           id,
                           username,
                           age,
                           phone,
                           email
                          )
                          values
                          (
                           user_seq.nextval,
                           userList(i).username,
                           userList(i).age,
                           userList(i).phone,
                           userList(i).email
                          );
      end loop;
    end user_insert_pro;
     数据库的准备工作就完成了,下面是java代码的工作。我使用的是MyBatis,要在Mapper里配置一个parameterMap
    
    • 1
    <parameterMap type="map" id="user_map">
            <parameter property="userList" javaType="java.util.ArrayList" mode="IN" jdbcType="ARRAY"
            typeHandler="com.jy.typeHandler.UserListHandler"/>
        </parameterMap>

    然后写mybatis里写存储过程调用时的参数类型就定义为这个parameterMap ,这样的意义就是配置的typeHandler会将java里传入的ArrayList转换成对应的数据库类型。UserListHandler代码如下

    package com.jy.typeHandler;
    
    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.jy.model.User;
    
    import oracle.sql.ARRAY;
    import oracle.sql.ArrayDescriptor;
    import oracle.sql.STRUCT;
    import oracle.sql.StructDescriptor;
    
    @SuppressWarnings("rawtypes")
    public class UserListHandler extends BaseTypeHandler
    {
    
        @Override
        public Object getNullableResult(ResultSet arg0, String arg1) throws SQLException
        {
            return null;
        }
    
        @Override
        public Object getNullableResult(ResultSet arg0, int arg1) throws SQLException
        {
            return null;
        }
    
        @Override
        public Object getNullableResult(CallableStatement arg0, int arg1) throws SQLException
        {
            return null;
        }
    
        @SuppressWarnings("unchecked")
        @Override
        public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object obj, JdbcType arg3)
                throws SQLException
        {
            Connection conn = null;
            try
            {
                if (null != obj)
                {
                    List<User> list = (ArrayList<User>) obj;
                    conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "root", "root");
                    // 数据库的type名必须大写
                    ARRAY array = getArray(conn, "USER_TYPE", "USER_TYPE_ARR", list);
                    preparedStatement.setArray(i, array);
                }
            } catch (Exception e)
            {
                e.printStackTrace();
            } finally
            {
                if (null != conn)
                {
                    conn.close();
                }
            }
        }
    
        private ARRAY getArray(Connection con, String OracleObj, String Oraclelist, List<User> data) throws Exception
        {
            ARRAY array = null;
            ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, con);
            STRUCT[] structs = new STRUCT[data.size()];
            StructDescriptor structdesc = new StructDescriptor(OracleObj, con);
            for (int i = 0; i < data.size(); i++)
            {
                Object[] result = { 
                                    data.get(i).getAge(), 
                                    data.get(i).getUsername(), 
                                    data.get(i).getPhone(),
                                    data.get(i).getEmail() 
                                };
                structs[i] = new STRUCT(structdesc, con, result);
            }
            array = new ARRAY(desc, con, structs);
            return array;
        }
    
    }
    

    再再Mapper里定义存储过程调用的语句

    <insert id="userInsert" useGeneratedKeys="false" parameterMap="user_map" statementType="CALLABLE">
            call user_insert_pro(?) 
        </insert>

    最后可以在java代码里用MyBatis调用存储过程了,MyBatis会基于刚才的配置,将java模型转换成数据库模型。 
    调用如下:

    @org.junit.Test
        public void test()
        {
            SqlSession session=sqlSessionFactory.openSession();
            List<User> list=new ArrayList<User>();
            for(int i=0;i<1000;i++)
            {
                list.add(new User("jy", 25, "oracle.com", "110"));
            }
            HashMap<String, Object> params=new HashMap<String,Object>();
            params.put("userList", list);
            session.insert("com.jy.dao.UserDao.userInsert", params);
            session.close();
        }

    全剧终!

    不管什么框架,主要找到java模型和数据库模型转换的方式就行了

    https://blog.csdn.net/ntuloser/article/details/52962988

     

     

     

    展开全文
  • 接收存储过程返回的多个结果集 Exam表结构 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for exam -- ---------------------------- DROP TABLE IF ...
  • Java执行Oracle存储过程接收返回值

    千次阅读 2016-03-01 15:18:21
    Java执行Oracle存储过程接收多个返回值(集合/数值)
  • 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...
  • 在项目中遇到一个问题,想要封装一个通用的可接收任意类型的List对象的方法,最开始以为很容易实现,通过List&lt;Object&gt;就可接收任意List&lt;实体类&gt;的对象,后来发现这根本行不通,最开始的...
  • java调用存储过程,返回list

    千次阅读 2012-09-20 21:36:23
    public List queryData(){  List list = new ArrayList();  Connection conn = null;  try {  conn = DBHelper.getConnection();  CallableStatement call = conn.
  • 存储过程的导入List集合

    千次阅读 2017-08-09 11:02:44
    这个存储过程在package中,以下是包中的详细代码,下面的代码包含伪代码,请结合实际进行参考 object的创建代码: craate or repalce type tanglei_lianxi_obj is object(  -- 列名  id number,  name varchar, ...
  • 使用存储过程查询数据库,返回了多个结果集,需要使用java接收和处理。并且展示到前端页面 二.环境: springboot+mybatis 数据库:sqlServer 三.解决过程存储过程: <!--返回结果集的配置--> <...
  • 初次学习存储过程调用,写得不是很好,有不对的地方大家多多指教,希望能对您有所帮助。1.普通返回值:Oracle存储过程:/*测试用存储过程*/create or replace procedure p_test(v_slid in varchar2,v_sm out varchar...
  • navicate创建mysql存储过程,同时需要对存储过程中的查询list结果集进行遍历,获取相应的结果参数执行其他的业务逻辑; 存储过程可定义事件定时器,定时执行函数,具体操作可见另一篇博文:navicate创建mysql存储...
  • 本文简单介绍一下QueryMultiple的用法,并给出用QueryMultiple来实现SQL Server存储过程分页
  • 其他同学提供的方式大部分都是Map接收调用mysql存储过程返回OUT结果集,要么游标,要么单个OUT,然后再次加工成想要的对象。涉及到直接用注解实现自动转换OUT参数结果集为对象时,都是忽略带过。 下面为各位踩坑的...
  • 以oracle存储过程为例 1.数据库表 create table ZD_UNIT_MENU ( unit_id VARCHAR2(32), menu_id VARCHAR2(32) ) 2.在Oracle中建立相应java对象的类型和数组 CREATE OR REPLACE TYPE unit_menu_obj AS OBJECT( ...
  • 但个人感觉不太够,现实应用中肯定不只是传输简短以及简单的json数据,于是自己琢磨着尝试从后台接收List、Map数据,在搜索工具的帮助以及自身的理解下,成功完成了接收过程。废话不多说,以代码来展示过程: * 前端...
  • 我测试所用的表分别为app_action、app_action_type、integral_...存储过程名为:mytest 创建语句如下: DROP PROCEDURE IF EXISTS `mytest`$$ CREATE DEFINER=`wsrp`@`%` PROCEDURE `mytest`() BEGIN SELECT COU
  • oracle没有直接的返回List的方法,这里需要有包定义一个Cursor(游标)的返回类型。下面是我在计算收益率的一段代码,只做参考。 oracle包的写法如下: CREATE OR REPLACE PACKAGE CAL_RTN_PACK IS    ...
  • SpringMVC用List接收请求参数

    千次阅读 2018-11-26 22:13:12
    list类型的参数,接收前台的数组值,实验了一下,结果还真可以。 不用绑定到对象里面。 当然我这个是前台传递了个包含的是string的数组到后台,然后,后台用list接收。 具体如下: 前台代码: //发送请求到后台...
  • sql: CREATE OR REPLACE TYPE test as object( FID NUMBER,  NUM nVARCHAR2(30),  TESKID NUMBER,  CID NUMBER, USERCODE nVARCHAR2(100) ...CREATE OR REPLACE TYPE test_list as table of test
  • oracle 存储过程

    千次阅读 2014-01-21 13:59:42
    创建和删除存储过程   创建存储过程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限。该权限可由系统管理员授予。创建一个存储过程的基本语句如下: CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 210,042
精华内容 84,016
关键字:

存储过程接收list