需求:

将寿险核心库中的黑名单数据提取到团险核心中,供团险核心使用,并且在核心前端页面需配置对应的菜单,提供相应的按钮,该接口采用dblink的方式进行提取。

通过本地数据库配置dblink访问远程数据库。在编码的过程中,考虑到项目上线之后dblink的名字可能会被替换,自己为使用到的远程数据库的这些表创建了同义词,提高了代码的可维护性。

dblink:通俗的讲,就是从一个数据库上,获得另外一个数据库的访问权,并对其进行增删改查操作。

创建dblink,我比较推荐使用写sql语句的方式,因为自己试过使用plsql图形化操作的方式,但是失败了,使用sql语句的形式成功了。

这是创建dblink的sql语句:

CREATE PUBLIC DATABASE LINK SLISOPER3Y CONNECT TO slisoper IDENTIFIED BY njnil3#5hiUil USING '(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.8.199.171)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = ghisuat)

)

)'

使用dblink的方式通过本地数据库查询0其他数据库sql:

SELECT * FROM t_slis_blaent@SLISOPER3Y;--结构:t_slis_blaent是另外一个数据库中表的名字    SLISOPER3Y:是dblink的名字

查询数据库中有多少个dblink :     SELECT * FROM dba_db_links

创建同义词:CREATE SYNONYM  SH_t_slis_blaent_sdf For t_slis_blaent_sdf@SLIS_UAT;

删除dblink: drop public database link SLISOPER3Y;--注意:一定要加上public,否则是删不了的。

 package com.sinosoft.lis.bjbs.tasks;

 import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import com.sinosoft.lis.common.bjbs.LogUtils;
import com.sinosoft.lis.manualtasks.tasks.TaskService;
import com.sinosoft.lis.pubfun.MMap;
import com.sinosoft.lis.pubfun.PubFun;
import com.sinosoft.lis.pubfun.PubSubmit;
import com.sinosoft.tech.log.Logger;
import com.sinosoft.tech.log.LoggerFactory;
import com.sinosoft.tech.security.UserInfo;
import com.sinosoft.utility.CError;
import com.sinosoft.utility.CErrors;
import com.sinosoft.utility.DBConnPool;
import com.sinosoft.utility.ExeSQL;
import com.sinosoft.utility.SSRS;
import com.sinosoft.utility.TransferData;
import com.sinosoft.utility.VData; /**
* <p>
* Title:黑名单数据提取
* </p>
*
* <p>
* Copyright: Copyright (c) 2012
* </p>
*
* <p>
* Company: Sinosoft
* </p>
*
* @author 赵永强
* @date 2019-08-22
*
*/
public class BlackListDataPushBL implements TaskService { static final Logger logger = LoggerFactory.getLogger(BlackListDataPushBL.class); /** 错误处理类,每个需要错误处理的类中都放置该类 */
private CErrors mErrors = new CErrors(); /** 传入数据的容器 */
private VData mInputData = new VData(); /** 往后面传输数据的容器 */
private VData mResult = new VData(); /** 提交数据的容器 */
private MMap mMMap = new MMap(); /** 存储全局变量 */
private UserInfo mUserInfo = new UserInfo(); private String mOperate; // 当前日志记录批次
private String mBatchID; private StringBuffer mStrBuff = new StringBuffer(); private ExeSQL mExeSQL = new ExeSQL(); private List<String> mMsgs = new ArrayList<>(); // 系统当前日期
private String mCurrentDate = PubFun.getCurrentDate();
// 系统当前时间
private String mCurrentTime = PubFun.getCurrentTime(); /** 抽数据日期 */
private String mStartDate;
private String mEndDate;
private String mDealDate;
// 记录日志
private LogUtils mLogUtils;
private String mCustomerNo;
private String mContNo; @Override
public boolean submitData(VData vData, String operate) {
if (!getInputData(vData, operate)) {
return false;
} if (!checkData()) {
return false;
} if (!dealData()) {
return false;
} return true;
} private boolean dealData() {
mLogUtils = new LogUtils("HMD", "黑名单数据提取");
logger.info("=====================推数开始=============日志批次号:" + mLogUtils.getBatchNo() + "=======");
mLogUtils.recordLog("Before");// 将pushflag=0 logger.info("&&&&&&&&&&&&&&& 开始推送黑名单数据 &&&&&&&&&&&&&&&"); // 先删除中间表的数据
if (!deleteData()) {
buildError("deleteData", "删除中间表数据失败!");
return false;
}
// 推送数据
if (!pushData()) {
buildError("pushData", "提取数据失败!");
return false;
} mLogUtils.recordLog("After");// 将pushflag=1 logger.info("=====================推数完成============日志批次号:" + mLogUtils.getBatchNo() + "=======");
return true;
} /**
* 先删除中间表中的数据
*
* @return
*/
private boolean deleteData() {
mMMap.put(" TRUNCATE TABLE t_slis_blaent ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_dobs ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_pobs ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_citizenships ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_nationalities ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_aliases ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_nativeCharNames ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_ids ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_routingCodes ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_programs ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_titles ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_addresses ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_otherIDs ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_sdf ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_extractsummary ", "TRUNCATE");
// 提交事务
if (!saveData()) {
buildError("saveData", "执行数据插入失败!");
return false;
}
// mMMap.put("delete from t_slis_blaent_releasenotes where createtime= '"
// + mDealDate + "' ","DELETE");
return true;
} /**
* 推送数据 使用同义词,防止上生产之后,dblink名字被替换掉,导致sql语句不能发挥作用
* 因为寿险库中黑名单表没有主键,现在团险新核心黑名单表有主键,在导入数据的时候会报违反唯一约束,去掉return
* false,即使某张表报错,并不影响其他表的导入。
*
* @return
*/
private boolean pushData() {
StringBuffer mStrBuff = new StringBuffer();
// 黑名单实体主表 问题现在寿险库中没有主键,团险核心库是有主键的,所以会报一个违反唯一约束,entityid <> '1234562'
mStrBuff.append(" insert into t_slis_blaent ");
mStrBuff.append(" select * from SH_t_slis_blaent ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent表数据插入失败!");
// return false;
}
// 黑名单实体出生日期
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_dobs ");
mStrBuff.append(" select * from SH_t_slis_blaent_dobs ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_dobs表数据插入失败!");
// return false;
}
// 黑名单实体出生地点 这张表中重复的数据台多了
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_pobs ");
mStrBuff.append(" select * from SH_t_slis_blaent_pobs ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_pobs表数据插入失败!");
// return false;
}
// 黑名单实体国民:
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_citizenships ");
mStrBuff.append(" select * from SH_t_slis_blaent_citizenships ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_citizenships表数据插入失败!");
// return false;
}
// 黑名单实体国籍
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_nationalities ");
mStrBuff.append(" select * from SH_t_slis_blaent_nationalities ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_nationalities表数据插入失败!");
// return false;
}
// 黑名单实体别名
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_aliases ");
mStrBuff.append(" select * from SH_t_slis_blaent_aliases ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_aliases表数据插入失败!");
// return false;
}
// 黑名单实体原体字符名称 entityid<>'1234562'
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_nativeCharNames ");
mStrBuff.append(" select * from SH_t_slis_blaent_nativeCharNames where entityid<>'1234562' ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_nativeCharNames表数据插入失败!");
// return false;
}
// 黑名单实体识别ID
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_ids ");
mStrBuff.append(" select * from SH_t_slis_blaent_ids ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_ids表数据插入失败!");
// return false;
}
// 黑名单实体金融机构路由代码
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_routingCodes ");
mStrBuff.append(" select * from SH_t_slis_blaent_routingCodes ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_routingCodes表数据插入失败!");
// return false;
}
// 黑名单实体制裁项目 有大量的重复数据
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_programs ");
mStrBuff.append(" select * from SH_t_slis_blaent_programs ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_programs表数据插入失败!");
// return false;
}
// 黑名单实体职位
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_titles ");
mStrBuff.append(" select * from SH_t_slis_blaent_titles ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_titles表数据插入失败!");
// return false;
}
// 黑名单实体地址
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_addresses ");
mStrBuff.append(" select * from SH_t_slis_blaent_addresses ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_addresses表数据插入失败!");
// return false;
}
// 黑名单实体其它ID 有9条重复数据
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_otherIDs ");
mStrBuff.append(" select * from SH_t_slis_blaent_otherIDs ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_otherIDs表数据插入失败!");
// return false;
}
// 黑名单实体补充数据: 有大量重复数据
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_sdf ");
mStrBuff.append(" select * from SH_t_slis_blaent_sdf ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_sdf表数据插入失败!");
// return false;
}
// 黑名单实体版本内容简介备份表 有4条重复数据
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_extractsummary ");
mStrBuff.append(" select * from SH_t_slis_blaent_extractsummary ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行数据插入失败!");
// return false;
}
// (生产不存在)黑名单实体版本更新记录
/*
* mStrBuff = new StringBuffer();
* mStrBuff.append(" insert into t_slis_blaent_extractsummary ");
* mStrBuff.append(
* " (VERSION, LISTIDS, LISTNAMES, LISTTYPES, LISTISSUERDATE, ACCTSEQ, BACKER, BACKTIME, BACKFLAG, CREATOR, CREATETIME, LOGID, SPARE1, SPARE2) "
* ); mStrBuff.append(" values( "); mStrBuff.append(
* " SELECT * FROM t_slis_blaent_extractsummary where createtime='"
* +mDealDate+"') "); mMMap.put(mStrBuff.toString(), "INSERT");
*/ return true;
} /**
* 对传入的数据进行校验
*
* @return 如果校验成功,则返回true,否则返回false
*/
private boolean checkData() { return true;
} /**
* 从输入数据中得到所有对象
*
* @param cInputData
* 传入数据对象
* @param cOperate
* 操作类型
* @return 如果没有得到足够的业务数据对象,则返回false,否则返回true
*/
private boolean getInputData(VData cInputData, String operate) {
// 获得全局公共数据
mInputData = (VData) cInputData.clone();
mUserInfo = (UserInfo) cInputData.getObjectByObjectName("UserInfo", 0);
TransferData tTransferData = (TransferData) cInputData.getObjectByObjectName("TransferData", 0);
// 现在前端不传这些值了 2019-08-28
/*
* mStartDate = (String) tTransferData.getValueByName("StartDate");
* mEndDate = (String) tTransferData.getValueByName("EndDate");
* logger.info("mStartDate>>>>>>>>>>>>" + mStartDate);
* logger.info("mEndDate>>>>>>>>>>>>" + mEndDate);
*/ return true;
} /**
* 数据提交
*
* @return 如果提交失败,则返回false,否则返回true
*/
private boolean saveData() { mInputData.clear();
mInputData.add(mMMap);
// 连接团险核心数据库
Connection conn = DBConnPool.getConnection(); try {
conn.setAutoCommit(false);
PubSubmit tPubSubmit = new PubSubmit(conn); if (!tPubSubmit.submitData(mInputData, null)) {
mErrors.addOneError(tPubSubmit.getErrors().getFirstError());
conn.rollback();
return false;
}
conn.commit();
} catch (SQLException e1) {
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
buildError("saveData", e1.getMessage());
return false;
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return true;
} @Override
public VData getResult() {
// TODO Auto-generated method stub
return mResult;
} /**
* 错误构造方法
*
* @param tFunctionName
* @param tErrorMessage
*/
private void buildError(String tFunctionName, String tErrorMessage) { CError tCError = new CError();
tCError.moduleName = this.getClass().getSimpleName();
tCError.functionName = tFunctionName;
tCError.errorMessage = tErrorMessage;
mErrors.addOneError(tCError);
logger.error(tErrorMessage);
System.out.println(tErrorMessage);
} @Override
public CErrors getErrors() {
// TODO Auto-generated method stub
return mErrors;
} /**
* 测试
*
* @param args
*/
public static void main(String[] args) {
BlackListDataPushBL tBlackListDataPushBL = new BlackListDataPushBL();
VData tData = new VData();
UserInfo tInfo = new UserInfo();
tInfo.setManageCom("86");
tInfo.setUserName("张三");
tInfo.setPassword("111");
TransferData transferData = new TransferData();
transferData.setNameAndValue("StartDate", "2019-08-28");
transferData.setNameAndValue("EndDate", "2019-08-29");
tData.add(tInfo);
tData.add(transferData);
tBlackListDataPushBL.submitData(tData, "");
} }

在编写代码的过程中:insert into 和select  语句在组合的时候,自己犯了错误,特意记下,避免以后再犯:

正确:

insert into t_slis_blaent select * from t_slis_blaent@SLISOPER3Y where createtime=date'2019-08-28';

错误:

Insert into t_slis_blaent(字段名) values(select * from t_slis_blaent where createtime=date’2019-09-09’)

接口-DBLINK初尝试的更多相关文章

  1. R语言爬虫初尝试-基于RVEST包学习

    注意:这文章是2月份写的,拉勾网早改版了,代码已经失效了,大家意思意思就好,主要看代码的使用方法吧.. 最近一直在用且有维护的另一个爬虫是KINDLE 特价书爬虫,blog地址见此: http://w ...

  2. SQLSERVER2012里的扩展事件初尝试(下)

    SQLSERVER2012里的扩展事件初尝试(下) SQLSERVER2012里的扩展事件初尝试(上) 我们继续文章扩展事件在Denali CTP3里的新UI(二)里的这个实验 脚本文件下载:http ...

  3. SQLSERVER2012里的扩展事件初尝试(上)

    SQLSERVER2012里的扩展事件初尝试(上) SQLSERVER2012里的扩展事件初尝试(下) 周未看了这两篇文章: 扩展事件在Denali CTP3里的新UI(一) 扩展事件在Denali ...

  4. codefirst初尝试

    Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code Firs ...

  5. 不安分的android开发者(小程序初尝试,前后台都自己做)

    前言 作为一个稍微有点想法的程序员来说,拥有一个自己开发,自己运营,完全属于自己的应用,应该是很多人的梦想.刚毕业那会,自己的工作是做游戏,于是也和朋友业余时间开发一些小游戏玩玩,可是终究不成气候,而 ...

  6. 中文编程语言之Z语言初尝试: ZLOGO 4

    原文: https://zhuanlan.zhihu.com/p/31505895. 作者为本人. @TKT2016 开发的Z语言(ZLOGO是它的一个部分)是本人至今看到的唯一一个仍活跃开发的开源且 ...

  7. 2017-12-24 手机编程环境初尝试-用AIDE开发Android应用

    前不久才接触到纯粹用手机进行编程的开发者, 当时颇有孤陋寡闻之感, 因为之前听说过手机编程还是一些在线编程学习网站开发的学习环境, 没有想过真的有用它做实际开发的. 此文用AIDE免费版在自己的手机上 ...

  8. 2017-11-28 中文编程语言之Z语言初尝试: ZLOGO 4

    "中文编程"知乎专栏原文. 作者为本人. @TKT2016 开发的Z语言(ZLOGO是它的一个部分)是本人至今看到的唯一一个仍活跃开发的开源且比较完整的中文编程语言项目. 它的源码 ...

  9. Scrapy初尝试

    ,python3.6版本 在看网上的安装的时候下一堆依赖,其实没有必要一个个的去装,pip直接分析依赖一块下载安装下来! 已经安装了pip模块 直接上 pip install scrapy 安装twi ...

随机推荐

  1. Redis专栏

    后端开发都应该掌握的Redis基础 Redis实用监控工具一览

  2. LeetCode 223. 矩形面积(Rectangle Area)

    223. 矩形面积 223. Rectangle Area 题目描述 在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积. 每个矩形由其左下顶点和右上顶点坐标表示,如图所示. LeetCode2 ...

  3. [转帖]熬夜变傻有科学依据,人类睡觉时会被“洗脑”,科学家首次拍下全程 | Science

    熬夜变傻有科学依据,人类睡觉时会被“洗脑”,科学家首次拍下全程 | Science https://mp.weixin.qq.com/s/hJeJjh0GSUclcoh3Z6mySQ 关注前沿科技 量 ...

  4. 在Jenkins的pipeline项目中运行jmeter测试-教程

    Jenkins 2.0的发布引入了一种新的项目类型 - Pipeline,以前只能通过插件获得.从Jenkins 2.0开始,Pipeline项目开箱即用. 与通常的“自由式”项目相比,管道构建具有几 ...

  5. 怎么查看服务器的cpu和内存的硬件信息

    在linux 下怎么查看服务器的cpu和内存的硬件信息     可以按照如下方式进行操作: 一.查看cpu总个数方法: 1.首先执行top命令,如下图中内容所表示. 2.在top命令的显示界面,按数字 ...

  6. dubbo学习之路-SPI机制

    dubbo学习之路-SPI机制 1.SPI 1.1Java SPI 原理 SPI是service provider interface简称.在java JDK中 内置的一种服务提供发现机制.它解决在一 ...

  7. Delphi 10 Seattle plus 新特性——System.JSON.Builders

    { 全能中间件 —— 简单.高效.稳定.安全的三层中间件 1.支持 多账套多数据库,包括SQLite, MySQL, SQL Server, Oracle, PostgreSQL, DB2, SQL ...

  8. python基础 — 循环重新输入

    后续完善各种循环案例 while True: try: str_num = input('input a number:') num = float(str_num) print("你输入的 ...

  9. 18 IO流(十五)——RandomAccessFile随机访问文件及使用它进行大文件切割的方法

    本文部分内容转自:https://blog.csdn.net/nightcurtis/article/details/51384126 1.RandomAccessFile特点 RandomAcces ...

  10. beego 读取配置

    不知道是不是坑 官方文档 https://beego.me/docs/module/config.md . 解决办法: 1 导入 config "github.com/astaxie/bee ...