当前位置:网站首页>如何使用 DATAX 以 UPSERT 语义更新下游 ORACLE 数据库中的数据
如何使用 DATAX 以 UPSERT 语义更新下游 ORACLE 数据库中的数据
2022-06-21 16:21:00 【InfoQ】
如何使用 DATAX 以 UPSERT 语义更新下游 ORACLE 数据库中的数据?
1 业务背景
2 DATAX 常见数据库 WRITER 插件是怎么实现 UPSERT 语义的?
- datax 的 MysqlWriter 和 oceanbasev10writer, 支持配置 writeMode 参数为 insert/replace/update,可以通过该参数控制写入数据到目标表时,底层采用 insert into/replace into/INSERT INTO ... ON DUPLICATE KEY UPDATE 语句:
- 其中 insert into 当主键/唯一性索引冲突时会写不进去冲突的行;
- 后两者没有遇到主键/唯一性索引冲突时与 insert into 行为一致,遇到冲突时会用新行替换原有行所有字段;
- datax原生的 OracleWriter 和PostgresqlWriter,不支持配置writeMode 参数,在底层实现上都是通过 JDBC 连接远程 Oracle/PG 数据库,并执行相应的 insert into ... sql 语句将数据写入 Oracle/pg,在内部会分批次提交入库。
3. ORACLE 的 MERGE INTO 语句
- UPDATE或INSERT子句是可选的
- UPDATE和INSERT子句可以加WHERE子句
- 在ON条件中可以使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
- UPDATE子句后面可以跟DELETE子句来去除一些不需要的行。
MERGE INTO [target-table] A USING [source-table sql] B
ON([conditional expression] and [...]...)
WHEN MATCHED THEN
[UPDATE sql]
WHEN NOT MATCHED THEN
[INSERT sql]
MERGE INTO member_staging x
USING (SELECT member_id, first_name, last_name, rank FROM members) y
ON (x.member_id = y.member_id)
WHEN MATCHED THEN
UPDATE SET x.first_name = y.first_name,
x.last_name = y.last_name,
x.rank = y.rank
WHERE x.first_name <> y.first_name OR
x.last_name <> y.last_name OR
x.rank <> y.rank
WHEN NOT MATCHED THEN
INSERT(x.member_id, x.first_name, x.last_name, x.rank)
VALUES(y.member_id, y.first_name, y.last_name, y.rank);
4. 更改 DATAX oracleWriter 以通过 MERGE INTO 语句实现 UPSERT 语义
- com.alibaba.datax.plugin.writer.oraclewriter.OracleWriter.Job#init:更改该方法以允许用户配置 writeMode;
- com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil#dealWriteMode:更改该方法以获取用户配置的 uniqueKeys 并在调用 WriterUtil.getWriteTemplate 时传递 uniqueKeys;
- com.alibaba.datax.plugin.rdbms.writer.util.WriterUtil#getWriteTemplate: 更改该方法,以在用户配置 writeMode 使用 replace 且配置了uniqueKeys时,拼接获取 ORACLE MERGE INTO 语句对应的 preparedStatement 字符串;
- com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter.Task#init:更改该方法以获取用户配置的 uniqueKeys;
- com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter.Task#calcWriteRecordSql:更改该方法以在调用 WriterUtil.getWriteTemplate 时传递 uniqueKeys;
- com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter.Task#fillPreparedStatementColumnType(PreparedStatement, int, int, String, Column): 更改该方法以在用户配置 writeMode 使用 replace 且配置了uniqueKeys时,对 ORACLE MERGE INTO 语句对应的 preparedStatement 的变量进行 setString 等赋值操作;
MERGE INTO %s x
USING (SELECT ? as member_id, ? as first_name, ? as last_name, ? as rank FROM dual) y
ON (x.member_id = y.member_id and x.xxx = y.xx)
WHEN MATCHED THEN UPDATE SET
x.first_name = y.first_name,
x.last_name = y.last_name,
x.rank = y.rank
WHEN NOT MATCHED THEN INSERT(x.member_id, x.first_name, x.last_name, x.rank)
VALUES(?,?,?,?);

边栏推荐
- 直播平台开发,直播各个分类单例设计展示
- Interceptor to realize web user login
- aws elastic beanstalk入门之简介
- 我被变相降薪了
- How can multidimensional analysis pre summary work?
- 【技术管理】集结号与亮剑团队
- SCAU Software Engineering Fundamentals
- Stack cognition - stack overflow instance (ret2shellcode)
- Differences between fragmentstatepageradapter and fragmentpageradapter
- 潤邁德醫療通過上市聆訊:預計虧損將增加,霍雲飛兄弟持股約33%
猜你喜欢

Nacos registry ----- built and used from 0

One trick: let logs help you make decisions through Yanrong SaaS data service platform +elk

Technical architecture of large websites | information encryption technology and key security management

C language DLL Dynamic Link Library

EtherCAT igh 'Fatal Sync Error'——0x002C,0x001A

From demand to open source, how to look at it with new eyes?

Stack cognition - stack overflow instance (ret2shellcode)

众安保险联合阿里健康、慧医天下 探索互联网慢病管理新模式

Accélérer le déploiement de l'application Native Cloud et compléter l'authentification de compatibilité entre Yanrong yrcloudfile et Tianyi Cloud

Kubernetes + Yanrong SaaS data service platform, personalized demand support has never been lost
随机推荐
Algorithm -- maximum number after parity exchange (kotlin)
Yrcloudfile of Yanrong technology has completed the compatibility certification with ANTP to jointly create a new blueprint for storage
直播平台开发,直播各个分类单例设计展示
Behind Yanrong SaaS service platform, which is as stable as a rock, is the rise of data ecology
Your cache folder contains root-owned files, due to a bug in npm ERR! previous versions of npm which
Use of list
C language DLL Dynamic Link Library
PTA L3-032 关于深度优先搜索和逆序对的题应该不会很难吧这件事 (30 分)
在线直播系统源码,实现进入页面就去请求列表接口并触底分页加载
list的模拟实现
PTA l3-031 thousand hand Guanyin (30 points)
从需求到开源,如何做到刮目相看?
Redis6.0 new features (Part 1)
Stm32f1 and stm32subeide programming example - linear Hall effect sensor driver
POSIX信号量
I am about to enter my senior year and begin my most sincere confession
wcdma与LTE的区别
Viewing technological changes through Huawei Corps (IV): interactive media (Music)
Xticks function in MATLAB
论文笔记 ACL 2022|Unified Structure Generation for Universal Information Extraction