需求:

将寿险核心库中的黑名单数据提取到团险核心中,供团险核心使用,并且在核心前端页面需配置对应的菜单,提供相应的按钮,该接口采用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. js继承的几种方法理解和代码演示

    1.属性继承 :call .apply:不建议使用浪费内存. function Person(name,age,sex){ this.name = name; this.age = age; this ...

  2. 第二篇:彻底搞清楚 Spring Boot 的配置文件 application.properties

    前言 在Spring Boot中,配置文件有两种不同的格式,一个是properties,另一个是yaml. 虽然properties文件比较常见,但是相对于properties而言,yaml更加简洁明 ...

  3. Nmap使用总结

    参考链接: https://nmap.org/man/zh/ http://www.360doc.com/content/18/0127/18/52402560_725574428.shtml 0X0 ...

  4. P-R曲线深入理解

    P-R曲线就是精确率precision vs 召回率recall 曲线,以recall作为横坐标轴,precision作为纵坐标轴.首先解释一下精确率和召回率. 解释精确率和召回率之前,先来看下混淆矩 ...

  5. 4. Spark SQL数据源

    4.1 通用加载/保存方法 4.1.1手动指定选项 Spark SQL的DataFrame接口支持多种数据源的操作.一个DataFrame可以进行RDDs方式的操作,也可以被注册为临时表.把DataF ...

  6. Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

    删除logs文件夹日志即可

  7. [洛谷P4052][JSOI2007]文本生成器

    题目大意:有$n$个字符串$s_i$,问有多少个长度为$m$的字符串至少包含$n$个字符串中的一个,字符集 A-Z .$s_i,m\leqslant100,n\leqslant60$ 题解:$AC$自 ...

  8. .Net Jpush极光推送

    1.首先登陆极光官网注册账号   https://www.jiguang.cn/push   2.注册成功后,在应用管理中创建应用

  9. HTTP缓存字段总结

    首部 通用首部:有些首部提供了与报文相关的最基本的信息,它们被称为通用首部. 请求首部:请求首部是只在请求报文中有意义的首部. 响应首部 实体首部: 用来描述HTTP报文的负荷,由于请求和响应报文中都 ...

  10. Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

    转自:https://www.jb51.net/article/98644.htm Java xml出现错误 javax.xml.transform.TransformerException: jav ...