oracle调用存储过程传递list参数

MyBatis中调用存储过程传入List集合参数的实例详解 项目中调用存储过程中传参-List类型详解 阅读详情

(一)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;
}

}


别再乱下载了!Pypi官网wheel文件名详解:从`cp310`到`manylinux`一看就懂 本文详细解析了Pypi官网wheel文件名的命名规则,从`cp310`到`manylinux`等标签的含义,帮助Python开发者快速找到适合自己环境的包。通过实例分析,介绍了如何根据Python版本、操作系统和CPU架构选择正确的wheel文件,避免安装失败和兼容性问题。 阅读详情

相关推荐

java传list给存储过程,项目提取,不忽悠

java传list给存储过程,项目提取,不忽悠java传list给存储过程,项目提取,不忽悠java传list给存储过程,项目提取,不忽悠

使用mybatis给Oracle存储过程传List,数组类型.

0.不废话.直接上过程 1.因为Oracle本身是有数组概念的.我们直接使用Oracle中的数组,但需要先创建类型,varray也就是Oracle的数组,100指定长度,of后面指定类型, CREATE OR REPLACE TYPE tables_array AS VARRAY(100) OF VARCHAR2(32); 2.第二步,创建一个表,进行测试数据, drop table ...

Dream的博客 7488

Anolis OS 23实战:5分钟搞定AI环境配置(含NVIDIA驱动一键安装)

本文详细介绍了如何在Anolis OS 23上快速配置AI开发环境,包括NVIDIA驱动的一键安装和TensorFlow、PyTorch等AI框架的部署。通过智能硬件适配引擎和优化后的二进制包,用户可在5分钟内完成传统需要数小时的配置工作,显著提升AI项目开发效率。

weixin_30335575的博客 535

Oracle存储过程入参传入List集合的小例子

第一步:创建一个对象类型 create or replace type STUDENT as object( id number(4), name varchar2(50), age number(3) ); /   第二步:创建一个数组类型 (任意选择下面的一句执行) -- 方式1:用table来盛放对象 create ...

weixin_34381687的博客 2912

基于MediaPipe的智能俯卧撑计数与姿势矫正系统

在现代健身和体能训练中,俯卧撑是最基础也是最有效的自重训练动作之一。然而,许多人在进行俯卧撑训练时常常存在姿势不正确、计数不准确等问题。本文将介绍如何利用计算机视觉和姿态估计技术,开发一个智能的俯卧撑计数与姿势矫正系统。

qq_36224726的博客 916

【AutoSAR】【EcuM】ECU状态管理

目录 一、EcuM架构位置 ​二、EcuM功能介绍 三、EcuM状态机 1.STARTUP阶段 2、UP状态 3、shutdown状态 4、休眠状态 5、OFF状态 一、EcuM架构位置 EcuM模块位于系统服务层,如下图红色方框里; 二、EcuM功能介绍 EcuM本身它管理着ECU在STARTUP, RUN,OFF,SLEEP,WAKEUP状态之间的相互切换。 责所有BSW的初始化以及去初始化 和ComM协作来管理网络状态,在需要时关闭ECU 管理所有的唤醒事件,并且在需要时

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 3354

Java中如何将一个 List 类型的参数传入存储过程(Oracle数据库)

Java中如何将一个 List 类型的参数传入存储过程(Oracle数据库)

weixin_44666786的博客 793

Python 爬虫实战:全球渔业船舶捕捞记录数据采集与分析全攻略

通过本项目,我们实现了对全球渔业船舶捕捞记录数据的采集、处理和可视化,为渔业资源管理和海洋生态保护提供了数据支持。未来,可以进一步结合机器学习和深度学习技术,对捕捞行为进行预测和分类,提高对非法捕捞活动的识别能力。

2201_76125261的博客 557

mybatis调用存储过程

没有具体开发过mybatis调用存储过程,通过查看代码及资料,记录如下 注意: 1、在xml里 属性-statementType=”CALLABLE” 2、使用 CREATE OR REPLACE PROCEDURE "SP_MF_I_IMP" ( I_MANIFEST_I_ID IN NUMBER ,

cc_yy_zh的博客 812

伺服系统控制原理深度解析

摘要:本文系统阐述了伺服系统的控制原理与应用。首先介绍了伺服系统的定义、组成及其在工业自动化中的重要性;然后详细分析了反馈控制机制、稳定性判据和性能指标;重点推导了传递函数和状态空间两种数学模型,并通过LaTeX公式展示了二阶系统建模过程;进而对比了PID控制、状态反馈及自适应控制等方法的优缺点;最后结合数控机床等案例,验证了理论方法的有效性,并展望了伺服系统智能化发展趋势。全文兼顾理论深度与实践指导性,为控制工程领域提供了系统的技术参考。

技术工作者 1264

Proxmox(pve)集群(4)存储(1)配置分布式存储ceph

它使用一种称为CRUSH(Controlled Replication Under Scalable Hashing)算法的数据分布算法来将数据均匀地分布在多个存储节点上,并确保数据的冗余和容错。它负责管理数据的分布、冗余和自动修复。PVE支持本地存储、LVM、NFS、iSCSI、CephFS、RBD、ZFS等存储方式,我这里使用两种存储方式,一种是通过ceph实现分布式存储,一种是通过truenas实现集中式存储。自我管理和自动恢复:Ceph具有自我管理的特性,可以动态地调整和优化存储集群的配置。

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺的博客 2623

java怎样将一个List传入Oracle存储过程

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 varchar2(32) ); c...

weixin_34024034的博客 88

YOLO11改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

YOLOv11改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

魔改工程师的博客 4513

JDBC执行Oracle传入参数为集合对象的存储过程

当需要把插入多条数据的行为合并为一个事务时,可以考虑把一个list型数据作为参数传入存储过程, 可以调用jdbc内部实现类来实现,这些类在classes12.zip(oracle 8,别的版本可能是其他名字的zip包)。 如: (一) 需要将一个list传入存储过程。 具体操作如下: 1,建立数据库对象来映射list数据类型。 --定义一个与list中各元素的数据类型相同的数据库对象 CREA...

weixin_30273931的博客 101

SOME/IP协议详解「1.0·概述」

主要讲解什么是someip,

雪云飞星的博客 5367

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Mybatis 接收 Oracle 游标出参

使用Oracle 游标返回结果集,mybatis 调用存储过程,java 接收 List结果。

qq_38220837的博客 1298

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)

原文链接:http://www.jb51.net/article/50540.htm 这篇文章主要介绍了oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包等相关资料,需要的朋友可以参考下 oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包 认识存储过程和函数 存储过程和函数也是一种PL

qq804702802的专栏 2698

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Oracle 存储过程 实现 JAVA中的LIST输入参数

今天周末没事做便想来试试JAVA与ORACLE的结合程度,结果反映这两件利器结合起来真的很厉害,前无古人,后无来者。嘿嘿~~ 因为上周末帮JAVA组的同事实现了一个输入数值->update记录->返回游标的存储过程,这些过程很简单。但当时就考虑到了一个问题,因为有在JAVA代码中调用这个存储过程之前先要从一个XLS文件中读取数据然后用INSERT插入ORACLE数据库表中。但发现在JAVA

枫$叶的专栏 9681

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

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

wekily的专栏 1万+

JAVA JDBC 调用存储过程 传参数

程序存储1000~2000条数据,我们现在是循环将每一条save进去,现想优化下用存储过程来实现。

u012879614的专栏 2192

java传递数组类型参数给oracle存储过程

新建一个oracle 数组类型的type     create or replace type str_list as varray(1000) of varchar2(40)     新建一个简单的存储过程测试用:     create or replace procedure getReservoirReportForms( stcds in str_lis

shizhan1881的专栏 1991

jdbc调用存储过程时,如何在将一个list型数据结构作为参数传入存储过程

jdbc调用存储过程时,如何在将一个list型数据结构作为参数传入存储过程。(转) 关键字: oracle,OracleCallableStatement,ARRAY 不过切记一点,调用Function会出问题,一定要是存储过程,不然会挂掉,以此作备忘,害我搞了一半天的~~~~ java 代码 /* 处理传入的数组 */ ArrayDescriptor desc = Arra...

ymy131931的博客 737

Oracle中的存储过程简单例子

Oracle中的存储过程简单例子 原文地址:http://blog.youkuaiyun.com/o9109003234/article/details/24910039 --创建表 create table TESTTABLE (   id1  VARCHAR2(12),   name VARCHAR2(32) ) select t.id1,t.name from TESTTABLE t

心的宁静专栏 2357

oracle+存儲過程參數,Oracle 存儲過程

1.创建和删除存储过程创建存储过程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限。该权限可由系统管理员授予。创建一个存储过程的基本语句如下:CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型...)]{AS|IS}[说明部分]BEGIN可执行部分[EXCEPTION错误处理部分]END...

weixin_30950075的博客 450
上一篇: 【转载】Nexus搭建Maven私服
下一篇: java把含小数点的数字字符串转换为int类型
tyjlearning
博客等级 码龄11年 24粉丝 83原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值