一、创建oracle 需要保存的数据类型type和存储过程produce
create TYPE "AL01TYPE" as object
(
-- 描述 : 档案批量转出
-- 作者 : dt
-- 时间 : 2025-05-10
-- 版本 :dev-1.0.1
aac003 NVARCHAR2(100),
aac002 NVARCHAR2(50),
aat001 NVARCHAR2(50),
aat002 NVARCHAR2(50),
aat013 NVARCHAR2(20),
aae011 NVARCHAR2(20),
aae036 NVARCHAR2(20),
aah002 NVARCHAR2(100)
);
create type AL01TYPELIST as table of AL01TYPE;
-- auto-generated definition
create PROCEDURE SP_HFSZHDA_DOUPLOADAL01(LIST IN AL01TYPELIST,
po_message OUT VARCHAR) IS
--描述:档案转出excel上传
--作者:dt
--时间:2025-05-10
--版本:dev-1.0.1
v_object AL01TYPE;
le_error EXCEPTION;
P_renum number(20);
v_aah002 VARCHAR(100);
ls_count number;
ls_aaf025 VARCHAR(50);
BEGIN
P_renum := 0; --初始化
FOR I IN 1 .. LIST.count LOOP
P_renum := 1 + P_renum;
v_object := LIST(I);
select replace(utl_raw.cast_to_varchar2(utl_raw.cast_to_raw(v_object.aah002)),unistr('\0000')) into v_aah002 from dual;
begin
Select count(0) into ls_count from az03 where aat001 = v_object.aat001 AND aat012 = '1';
if ls_count=0 then
po_message := '号:'||v_object.aat001||' 状态异常请核对后再上传!';
RAISE le_error;
end if;
Select count(0) into ls_count From AL01 where aaj022='1' and aat001=v_object.aat001 and aah002=v_aah002;
if ls_count =0 then
-- 开始插入信息
select SQ_AAF025.nextval into ls_aaf025 from dual;
insert into AL01(
aaf025,
aat012,
aat001,
aac003,
aac002,
aat002,
aat013,
aaj022,
aaj026,
aae011,
aae036,
aah002)values(
ls_aaf025,
'1',
v_object.aat001,
v_object.aac003 ,
v_object.aac002 ,
v_object.aat002 ,
v_object.aat013,
'1',
'excel上传数据',
v_object.aae011,
v_object.aae036,
v_aah002
);
end if;
IF P_renum >1000 THEN
commit;
P_renum:=0;
END IF;
po_message :='ok';
EXCEPTION
WHEN le_error THEN
NULL;
WHEN OTHERS THEN
ROLLBACK;
po_message := '上传失败' || SQLCODE || SQLERRM;
end;
END LOOP;
COMMIT;
END SP_HFSZHDA_DOUPLOADAL01;
二、通过过程上传list
package com.cominfo.elecfile.utils;
import oracle.jdbc.OracleConnection;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
import org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor;
import java.sql.Connection;
import java.util.List;
/**
* 描述
*
* @Auther: dt
* @Date: 2025/5/10 0027 09:00
*/
public class OracleUtil {
/**
* 根据数据库中你的type将List组装成Array
* @param con
* @param OracleObj
* @param Oraclelist
* @param objlist
* @return
* @throws Exception
*/
public static ARRAY getArray(Connection con, String OracleObj, String Oraclelist, List<Object[]> objlist) throws Exception {
ARRAY array=null;
C3P0NativeJdbcExtractor cp30NativeJdbcExtractor = new C3P0NativeJdbcExtractor();
OracleConnection connection = (OracleConnection) cp30NativeJdbcExtractor.getNativeConnection(con);
if (objlist != null && objlist.size() > 0) {
StructDescriptor structdesc = new StructDescriptor(OracleObj, connection);
STRUCT[] structs = new STRUCT[objlist.size()];
for (int i = 0; i < objlist.size(); i++) {
Object[] result= (Object[]) objlist.get(i);
structs[i] = new STRUCT(structdesc, connection, result);
}
ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,connection);
array = new ARRAY(desc, connection, structs);
}
return array;
}
}
List<Object[]> arrList = new ArrayList<>();
//解析数据datamap
for (Map<String, String> dataMap : dataMaps) {
//创建保存对象
Object[] objects =new Object[]{
dataMap.get("aac003"),
dataMap.get("aac002"),
dataMap.get("aat001").trim(),
dataMap.get("aat002"),
dataMap.get("aat013"),
'admin',
DateUtil.getCurrentTimeStr(),
'ec-20250510-wcdedgk2091',
};
arrList.add(objects);
}
//开始调用过程
long startTime=System.currentTimeMillis();
Connection connection = null;
CallableStatement sqlres = null;
String sql = "call SP_HFSZHDA_DOUPLOADAL01(?,?)";
String msg = "";
try {
connection = dataSource.getConnection();
ARRAY paramArr = OracleUtil.getArray(connection,"AL01TYPE","AL01TYPELIST",arrList);
sqlres = connection.prepareCall(sql);
sqlres.setArray(1, paramArr);
sqlres.registerOutParameter(2, Types.VARCHAR);
sqlres.execute();
msg = sqlres.getString(2);
long endTime=System.currentTimeMillis()-startTime;
System.out.println("上传后获取的返回参数为:"+msg+"||耗时:"+endTime/1000+"秒");
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (sqlres != null) {
sqlres.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
if (!"ok".equals(msg)){
throw new BusinessException("上传失败!"+msg);
}
}
相关推荐:
AI自动化:开启智能未来的无限可能,simplify ai
seo相关知识是什么,seo相关技术 ,ai写作讯飞星火认知大模型
ChatGPT回答问题,网页无法线下滚动?解决方案轻松get!,谷歌AI铃声
AI人工智能文章生成器写作新纪元
AI生成网页模板,轻松打造专业网站,ai网格画法
ChatGPT诞生背景:人工智能如何突破语言的边界,ai辅助市场调研
打造内容创作新高度:文章扩写AI的革命性优势
重生成AI:突破科技前沿,开启智能未来
ChatGPT:智能对话开创新时代,ai做渐变直线
SEO地址优化的秘诀:提升网站排名与流量的关键,临沂如何优化网站关键词
SEO门户:打造高效网站流量的关键利器,创意网站建设要求
智能AI写文章:高效创作新风尚
seo能解决什么问题,seo会遇到哪些问题 ,挚爱花嫁ai
ChatGPT:OpenAI的创新之作-一款颠覆传统的语言模型,ai球衣号
ChatGPT3.5最新版:智能对话新纪元,带你进入AI的未来世界,ai苔藓生长
SEO全套秘籍:提升网站流量与排名的终极指南,荣昌手机网站建设
SEO培训:助力企业实现互联网营销的无限可能,平塘网站优化推广价格
OpenAI您的信用卡被拒绝了?请尝试用借记卡支付,轻松解决支付问题!,ai cdr缩略图补丁
专业SEO助力企业在激烈市场竞争中脱颖而出,嘉兴海外网站推广价格
丹东抖音seo是什么,抖音seo引流 ,ai工具编写作业指导书
seo链接锚是什么,什么是锚链接,如何设置锚链接 ,保山智能AI
Chatttst:开启智能沟通新时代的无限可能,上海联通ai
SEO可以帮助网站在搜索引擎中获得较高的排名-助力企业数字化转型的关键,赵立新AI换脸图片对比
为什么“搜狗不收录”会成为企业SEO的新挑战?,烤肉店的线下营销与推广
AI网页版本:开启智能时代的新篇章,拼音标调ai
SEO优化流程:助力网站快速提升排名的关键策略,1745ai
AI软件不用登录,让你的工作更高效轻松,智能ai写作改稿怎么改
ChatGPT怎么打不开了?解决办法,轻松恢复畅通无阻!,ai订酒店ai对话
SEO组织:让您的网站流量倍增的秘密武器,seo 绩效标准
为什么选择老域名注册,打造品牌价值的秘密武器,网站建设服务费用多少
什么是“神马关键词”?如何用它提升你的网络营销效果?,新闻发布网站怎么做推广
SEO运营是什么职业,seo运营工程师招聘 ,把ai图层改横幅
SEO要不,来看看如何通过SEO优化提高网站流量和曝光度,seo 获客技巧
ChatGPT不能用了?了解这一背后的真相及解决方法,ai恐怖头像
GPT哪个模型是最新的?AI语言生成的未来,ai回头
ChatGPT打开后空白:如何解决这个困扰并高效使用AI助手,ai四声怎么写
360优化关键词-提升网站流量与排名的秘密武器,美拍ai
AI热门软件,未来科技的钥匙
目前AI软件有哪些?智能新时代的必备工具
SEO导航:助力网站提升流量与排名的必备工具,荣昌建筑网站建设
ChatGPT怎么打不开了?揭秘背后的原因与解决方法,ai中打开ai文件丢失
什么是seo公司口碑,seo品牌 ,ai大模型训练是什么意思
什么是seo伪原创,seo就业前景伪原创怎么写 ,头像ai画怎么弄
seo网赚什么意思,网站seo赚钱 ,ai打不开ai
SEO指:如何通过精准优化提高网站流量和转化率,无锡论坛营销推广要多久
SEO百度优化:让你的品牌在搜索引擎中脱颖而出,日照网站推广策划
怎么让AI润色文章,让写作更轻松?
ChatGPT的超链接点不开?解决方法一网打尽!,情感ai写作指令是什么
SEO有点:揭秘优化之道,提升网站排名的秘诀,广州抖音seo厂家地址
怎么用AI写出高质量科普文章?揭秘新时代创作利器!