需求:

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

    编程只是 if : 为了少写重复的代码,有了循环 for/while: 但碰到很长的重复代码,可能用一个循环难以实现,所以出现了面向对象的思想: 类:就是你的循环主体 实例:就是对你的循环的一次调用 ...

  2. Python-10-迭代器

    一.定义 1. 迭代的概念 迭代器即迭代的工具,那什么是迭代呢?迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不是迭 ...

  3. C++类的组合、前向引用声明

    3.5类的组合 Part1.应用背景 对于复杂的问题,往往可以逐步划分为一系列稍微简单的子问题. 解决复杂问题的有效方法是将其层层分解为简单的问题组合,首先解决简单问题复杂问题也就迎刃而解了. 在面向 ...

  4. 【IDEA使用技巧】(1) —— 快捷键

    1.InteliJ IDEA设置快捷键 1.1. IDEA快捷键修改—代码提示 IDEA中当现有的快捷键被系统中其他软件(比如输入法)占用时,我们可以自定义修改快捷键.比如,IDEA中的代码自动提示快 ...

  5. Python Django 协程报错,进程池、线程池与异步调用、回调机制

    一.问题描述 在Django视图函数中,导入 gevent 模块 import gevent from gevent import monkey; monkey.patch_all() from ge ...

  6. java8之lambda表达式(默认方法)

    [推荐]2019 Java 开发者跳槽指南.pdf(吐血整理)>>> 许多开发语言都将函数表达式集成到了其集合库中.这样比循环方式所需的代码更少,并且更加容易理解.以下面的循环为例: ...

  7. React Native 开发豆瓣评分(二)路由配置

    路由管理使用官方推荐的 React Navigation; 配置环境 安装相关依赖 yarn add react-navigation react-native-gesture-handler Lin ...

  8. Angular配置路由以及动态路由取值传值跳转

    Angular配置路由 1.找到 app-routing.module.ts 配置路由 引入组件 import { HomeComponent } from './home/home.componen ...

  9. python 数据类型 常用法方

    python 数据类型 常用法方 upper() 大写 str lower() 小写 str strip() rstrip() lstrip() 去除字符两边的空格 去右边 左边空白 str repl ...

  10. QTableWidget数据表格

    void setRowHeight(int row, int height); //行高 void setVerticalHeaderLabels(const QStringList &lab ...