需求:用户导入100万白名单,如果该导入的白名单存在于数据库中,就不执行白名单导入功能。所以要对该导入白名单与数据库进行比对,将不再白名单中的数据传入。
单次10000个白名单批量插入前,将其过滤,单次操作session 开启时间不会太长,数据压力不大,session系统数量可以保证。
该过滤功能逻辑很简单,下面贴出管道表函数在java中的灵活运用
1)构建一个rowtype 这个row type 与java中传入的数组中单条数据结构保持一致
create or replace type MdnUser_row_type as object
(
mdn VARCHAR(15),
mdnOwner VARCHAR(20),
whiteid VARCHAR(20),
batchid VARCHAR(20),
status VARCHAR(20),
addTIME VARCHAR(20)
)
2)定义自定义数组table 类型
CREATE OR REPLACE TYPE MDNUSER_TABLE_TYPE AS TABLE OF MdnUser_row_type
3)构建管道表函数
create or replace function fn_to_table(MdnUser_TABLE IN MdnUser_TABLE_TYPE )
return MdnUser_TABLE_TYPE PIPELINED
as
MdnUser_row MdnUser_row_type ;
BEGIN
for i in 1..MdnUser_TABLE.count LOOP
MdnUser_row := MdnUser_TABLE(i);
PIPE ROW (MdnUser_row);
END LOOP ;
RETURN ;
end;
4)组装sql
String tblName = "NM_NET_USER_" +spid;
StringBuffer sb = new StringBuffer("");
sb.append("SELECT TEMPTBL.MDN ,TEMPTBL.MDNOWNER ,TEMPTBL.WHITEID, ");
sb.append("TEMPTBL.BATCHID,TEMPTBL.STATUS,TEMPTBL.ADDTIME ");
sb.append("FROM TABLE(FN_TO_TABLE(?)) TEMPTBL WHERE NOT EXISTS ");
sb.append("(SELECT U.MDN FROM "+tblName+" U WHERE U.MDN = TEMPTBL.MDN)") ;
return sb.toString();
5)数据访问部分代码
conn = conn.getMetaData().getConnection();
ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor("MDNUSER_TABLE_TYPE", conn);
oracle.sql.ARRAY array = new oracle.sql.ARRAY(arrayDesc, conn,userArray);
pstmt = conn.prepareStatement(sqlQuery);
pstmt.setArray(1, array);
rs = pstmt.executeQuery();
6) 说明
TABLE(FN_TO_TABLE(?)) 管道表函数可以在sql中直接调用
conn = conn.getMetaData().getConnection();
hibernate session 获得的connection 无法直接向 oracle.jdbc.OracleConnection转型 ,要特出处理
MDNUSER_TABLE_TYPE
一定要大写 保持与数据库中type一致
oracle.sql.ARRAY array = new oracle.sql.ARRAY(arrayDesc, conn,userArray);
将java 数组转换为oracle 数组
分享到:
相关推荐
java调用oracle存储过程或者函数
你还在为如何调用oracle中的存储过程和函数而烦恼吗,请看看该文档。
Java调用oracle函数返回oracle类(类似)集合
调用数据库里的一个函数 一个函数本质上一个返回一个结果的存储过程,这个例子示范了怎么调用有in、out和in/out参数的函数
Java调用oracle存储过程
用java调用oracle存储过程总结.
基本查询 过滤和排序 单行函数 组函数 多表查询 子查询 集合运算 创建和管理表 光标 例外 Java调用存储过程和存储函数 触发器
通过实例详细介绍了用java调用oracle存储过程的方法和步骤,包括无返回值的存储过程、有返回值的存储过程(非列表)和返回列表的存储过程的编写、JAVA调用,是一个对存储过程调用的一个全面总结,对程序开发具体实际...
java调用oracle存储过程返回结果集,Record,cursor参照.pdf
Java调用Oracle的过程和函数
java调用oracle存储过程.wps java调用oracle存储过程.wps java调用oracle存储过程.wps
讲有关java如何调用ORACLE存储过程以及游标使用,它只包含JAVA调用ORACLE存储过程游标使用(上),还有JAVA调用ORACLE存储过程游标使用(上),
java调用oracle bpm API
Java调用Oracle存储过程的方法
JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程
java调用oracle存储过程实现增删改查
NULL 博文链接:https://fruitking.iteye.com/blog/1447333
java调用oracle存储过程入门实例 增删改查 使用dom4j读取数据库的配置文件(xml) jdbc中connection的管理 使用threadlocal
VB 调用 Oracle 函数返回数据集的例子 VB 调用 Oracle 函数返回数据集的例子 VB 调用 Oracle 函数返回数据集的例子