需求:

将寿险核心库中的黑名单数据提取到团险核心中,供团险核心使用,并且在核心前端页面需配置对应的菜单,提供相应的按钮,该接口采用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. QT 安装 配置过程

    QT, QT creator的安装,环境配置: 需要根据这个连接重新梳理一遍:https://blog.csdn.net/win_turn/article/details/50465127 1)一种方 ...

  2. Java开发笔记(一百三十二)Swing的表格

    前面介绍了程序界面上一些简单控件的组合排列,它们用来表达相互之间联系较弱的信息倒还凑合,要是用来表达关联性较强的聚合信息就力不从心了.倘若只是简单信息的罗列,例如商品名称列表.新闻标题列表.学生姓名列 ...

  3. c++递归函数

    一.什么是递归算法 递归即递推+回归.递归算法是把问题转化为规模缩小了的同类子问题,然后递归调用函数(或过程)来表示问题的解. 二.递归算法的特点 1.必须有 递归函数 + 递归出口 2.递归算法解题 ...

  4. linux初识1

    linux 操作系统 概念性的理解 1.Linux内置解释器bash 相当于pyhon解释器 2.Linux的内部大多是使用python去书写 云计算 1.只需要 花钱,买腾讯,阿里云服务器 2.专人 ...

  5. js光标定位操作

    1. 自动选中区域内容 <html> <meta http-equiv="Content-Type" content="text/html; chars ...

  6. ActiveMQ(一)

    下载地址:http://activemq.apache.org/download.html 换数据源: ActiveMQ的独占消费

  7. jquery easyui datagrid 在翻页以后仍能记录被选中的行及刷新设置选中行数据

    //easyUI的datagrid在复选框多选时,如何在翻页以后仍能记录被选中的行://注意datagrid中需要配置idField属性,一般为数据的主键 $.ajax({ type: 'GET', ...

  8. 利用PHPExcel快速导出excel

    <?php $objPHPExcel = new PHPExcel(); $objSheet = $objPHPExcel->getActiveSheet(); $array = arra ...

  9. error LNK2005: “找到一个或多个多重定义的符号” 已经在 xxxx.obj 中定义 的解决方法

    1 问题还原 这里我有三个源文件:Base.hpp, Base.cpp 和 main.cpp 在Base.hpp里面定义一个基类,注意,基类只包含构造函数和析构函数的声明,函数在Base.cpp里实现 ...

  10. VS2017 配置 boost_1_70

    1. 下载与安装 1.1 安装方法1 (1) 下载 https://www.boost.org/ 或者使用 https://sourceforge.net/projects/boost/files/b ...