oracle通過存儲(chǔ)過程上傳list保存功能
一、創(chuàng)建oracle 需要保存的數(shù)據(jù)類型type和存儲(chǔ)過程produce
create TYPE "AL01TYPE" as object
(
-- 描述 : 檔案批量轉(zhuǎn)出
-- 作者 : dt
-- 時(shí)間 : 2021-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
--描述:檔案轉(zhuǎn)出excel上傳
--作者:dt
--時(shí)間:2021-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 := '號(hào):'||v_object.aat001||' 狀態(tài)異常請(qǐng)核對(duì)后再上傳!';
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上傳數(shù)據(jù)',
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: 2021/5/10 0027 09:00
*/
public class OracleUtil {
/**
* 根據(jù)數(shù)據(jù)庫(kù)中你的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<>();
//解析數(shù)據(jù)datamap
for (Map<String, String> dataMap : dataMaps) {
//創(chuàng)建保存對(duì)象
Object[] objects =new Object[]{
dataMap.get("aac003"),
dataMap.get("aac002"),
dataMap.get("aat001").trim(),
dataMap.get("aat002"),
dataMap.get("aat013"),
'admin',
DateUtil.getCurrentTimeStr(),
'ec-20210510-wcdedgk2091',
};
arrList.add(objects);
}
//開始調(diào)用過程
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("上傳后獲取的返回參數(shù)為:"+msg+"||耗時(shí):"+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);
}
}
到此這篇關(guān)于oracle通過存儲(chǔ)過程上傳list保存功能的文章就介紹到這了,更多相關(guān)oracle保存list內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- oracle 存儲(chǔ)過程返回 結(jié)果集 table形式的案例
- 解決PL/SQL修改Oracle存儲(chǔ)過程編譯就卡死的問題
- 關(guān)于Oracle存儲(chǔ)過程和調(diào)度器實(shí)現(xiàn)自動(dòng)對(duì)數(shù)據(jù)庫(kù)過期數(shù)據(jù)清除的問題
- Oracle如何批量將表中字段名全轉(zhuǎn)換為大寫(利用簡(jiǎn)單存儲(chǔ)過程)
- Spring boot調(diào)用Oracle存儲(chǔ)過程的兩種方式及完整代碼
- oracle調(diào)試存儲(chǔ)過程的過程詳解
- Oracle如何使用PL/SQL調(diào)試存儲(chǔ)過程
- Oracle存儲(chǔ)過程案例詳解
相關(guān)文章
Oracle和MySQL的數(shù)據(jù)導(dǎo)入為何差別這么大
這篇文章主要介紹了Oracle和MySQL的數(shù)據(jù)導(dǎo)入有哪些區(qū)別,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08
Oracle數(shù)據(jù)庫(kù)把多行轉(zhuǎn)一列逗號(hào)分割兩種方法
Oracle將行轉(zhuǎn)換為列是指將關(guān)系型數(shù)據(jù)庫(kù)中的行數(shù)據(jù)轉(zhuǎn)換為列數(shù)據(jù)的操作,這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)把多行轉(zhuǎn)一列逗號(hào)分割兩種方法的相關(guān)資料,需要的朋友可以參考下2024-07-07
Oracle索引(B*tree與Bitmap)的學(xué)習(xí)總結(jié)
本篇文章是對(duì)Oracle索引(B*tree與Bitmap)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
ORACLE數(shù)據(jù)庫(kù)查看執(zhí)行計(jì)劃的方法
基于ORACLE的應(yīng)用系統(tǒng)很多性能問題,是由應(yīng)用系統(tǒng)SQL性能低劣引起的,所以,SQL的性能優(yōu)化很重要,分析與優(yōu)化SQL的性能我們一般通過查看該SQL的執(zhí)行計(jì)劃,本文就如何看懂執(zhí)行計(jì)劃,以及如何通過分析執(zhí)行計(jì)劃對(duì)SQL進(jìn)行優(yōu)化做相應(yīng)說明2012-05-05
oracle復(fù)制表結(jié)構(gòu)和復(fù)制表數(shù)據(jù)語句分享
這篇文章主要介紹了oracle復(fù)制表結(jié)構(gòu)和復(fù)制表數(shù)據(jù)的語句,大家直接使用就可以了2014-03-03
Oracle創(chuàng)建帶有參數(shù)的視圖代碼介紹
這篇文章主要介紹了Oracle創(chuàng)建帶有參數(shù)的視圖代碼介紹,簡(jiǎn)介地介紹了創(chuàng)建方法,具有一定參考價(jià)值,需要的朋友可以了解下。2017-09-09
oracle導(dǎo)入線上數(shù)據(jù)的詳細(xì)指南
這篇文章主要介紹了oracle導(dǎo)入線上數(shù)據(jù)的全步驟,文中通過代碼示例和圖文結(jié)合的形式講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-11-11
oracle—SQL技巧之(一)連續(xù)記錄查詢sql案例測(cè)試
有這樣一個(gè)需求:需要查詢出某個(gè)客戶某一年那些天是有連續(xù)辦理過業(yè)務(wù),本文給予sql實(shí)現(xiàn)語句并測(cè)試,感興趣的朋友可以了解下2013-01-01

