解析oracle的DDL语句生成高斯内表及表字段主键配置

2024-04-11 01:44

本文主要是介绍解析oracle的DDL语句生成高斯内表及表字段主键配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

oracle的DDL语句如下:

CREATE TABLE TPPROD.CONFIG (NO VARCHAR2(50),CONFIGCODE VARCHAR2(400),CONFIGVALUE VARCHAR2(400),CONSTRAINT PK_GUENDORASSISTCONFIG PRIMARY KEY (NO,CONFIGCODE)
);
CREATE UNIQUE INDEX PK_GUENDORASSISTCONFIG ON TPPROD.GUENDORASSISTCONFIG (NO,CONFIGCODE);

解析oracle表生成高斯内表入口:Oracle2GaussCreateMana.scala

package com.tpiods.sqoop.oracle2gaussimport java.io.{File, FileInputStream, PrintWriter}
/*** 输入: oracle建表语句* 输出: gauss内表建表语句*/
object Oracle2GaussCreateMana {def main(args: Array[String]): Unit = {// 指定输入sql语句的文件val input = "ods_etl/src/main/resources/work0409_test/test_tab.sql"val lines = scala.io.Source.fromInputStream(new FileInputStream(input)).getLines()val str = readSql(lines)val str1 = replaceSql(str)val str2 = addTeacCols3(str1)// 指定输出sql语句的文件val output1 = "ods_etl/src/main/resources/work0409_test/test_tab_mana.sql"val writer = new PrintWriter(new File(output1))writer.write(str2)writer.close()}/*** 处理建表语句的转换逻辑* @param lines* @return*/def readSql(lines: Iterator[String]): String = {val sb = new StringBuildervar colCnt = 0var pkCols: String = ""for (line <- lines if line != null) {if (line.startsWith("CREATE TABLE") || line.startsWith("  CREATE TABLE") || line.startsWith("  CREATE TABLE")) {colCnt = colCnt + 1val tabName = line.split("\\.")(1).replaceAll(" ", "").replaceAll("\\(", "")if (sb.length >= 1) {sb.append(s"""|set search_path = ods;|drop table if exists ${tabName};|create table if not exists ${tabName} (\t\n""".stripMargin)} else {sb.append(s"""|set search_path = ods;|drop table if exists ${tabName};|create table if not exists ${tabName} (\t\n""".stripMargin)}}if (line.startsWith("\t\"")  || line.startsWith("\t")) {val split = line.split("\\s+")if (!("CONSTRAINT" == split(1)) && split.length >= 3) {if (colCnt == 1) {sb.append(" ").append(split(1)).append("\t").append(split(2)).append("\n")} else {sb.append(",").append(split(1)).append("\t").append(split(2)).append("\n")}}colCnt = 0}if (line.startsWith("   (") || line.startsWith(" (    ")) {val split = line.split("\\s+")sb.append(split(2)).append("\t").append(split(3)).append("\n")}if (line.indexOf("PRIMARY KEY ")> 0) {pkCols = line.split("PRIMARY KEY ")(1)}if (line.startsWith(");") || line.endsWith("MOVEMENT  |") || line.startsWith("   )")) {
//        sb.append(
//          s""") WITH (orientation=column, compression=low)
//            |DISTRIBUTE BY HASH${pkCols}
//            |;
//            |""".stripMargin)// 不按主键做hash,则打开下面这段代码sb.append(s""");|""".stripMargin)}}sb.toString()}/*** oracle数据类型替换成gauss对应的数据类型* @param str* @return*/def replaceSql(str: String): String = {str.toLowerCase().replaceAll("\"", "").replaceAll("number\\(\\*+,\\d*\\)", "number").replaceAll(",\n", "\n").replaceAll("\\b" + "nchar" + "\\b", "char").replaceAll("\\b" + "varchar2|nvarchar2" + "\\b", "varchar").replaceAll("\\b" + "long" + "\\b", "text")}/**** @param lines2 读入字段类型替换后的sql* @return 业务字段之后增加技术字段*/def addTeacCols(lines2: String): String = {lines2.replaceAll("\\) with",""",oper	varchar|,mtime	numeric(38,5)|,source_sys	varchar|,etl_time	varchar|,etl_date	varchar|)|with""".stripMargin)}/***不按主键做hash,调用该方法* @param lines2 读入字段类型替换后的sql* @return 业务字段之后增加技术字段*/def addTeacCols2(lines2: String): String = {lines2.replaceAll("\\);",""",oper	varchar|,mtime	numeric(38,5)|,source_sys	varchar|,etl_time	varchar|,etl_date	varchar|);|""".stripMargin)}/*** 按主键做hash* @param lines2 读入字段类型替换后的sql* @return 业务字段之前增加技术字段*/def addTeacCols3(lines2: String): String = {lines2.replaceAll("\t\n","""| tabname varchar|,oper	varchar|,mtime	numeric(38,5)|,source_sys	varchar|,etl_time	varchar|,etl_date	varchar|,""".stripMargin)}/*** 不按主键做hash,调用这个方法* @param lines2 读入字段类型替换后的sql* @return 业务字段之前增加技术字段*/def addTeacCols4(lines2: String): String = {lines2.replaceAll("\t\n","""| tabname varchar|,oper	varchar|,mtime	numeric(38,5)|,source_sys	varchar|,etl_time	varchar|,etl_date	varchar|,""".stripMargin)}
}

运行以上代码,输出如下:

set search_path = ods;
drop table if exists config;
create table if not exists config (tabname varchar
,oper	varchar
,mtime	numeric(38,5)
,source_sys	varchar
,etl_time	varchar
,etl_date	varchar
, no	varchar(50)
,configcode	varchar(400)
,configvalue	varchar(400)
);

解析oracle表生成表名字段主键配置入口:OracleGeneTabColsPk.scala

package com.tpiods.sqoop.oracle2gaussimport java.io.{File, FileInputStream, PrintWriter}
/*** 输入: oracle源系统建表语句* 输出: 表名|列名...|主键*/
object OracleGeneTabColsPk {def main(args: Array[String]): Unit = {// 指定输入sql语句的文件val input = "ods_etl/src/main/resources/work0409_test/test_tab.sql"val lines = scala.io.Source.fromInputStream(new FileInputStream(input)).getLines()val str = readSql(lines)// 指定输出sql语句的文件val output = "ods_etl/src/main/resources/work0409_test/test_tab_tabcolspk.txt"val writer = new PrintWriter(new File(output))writer.write(str)writer.close()}def readSql(lines: Iterator[String]): String = {val sb = new StringBuildervar tableName: String = nullfor (tempString <- lines if tempString != null) {if (tempString.startsWith("CREATE TABLE") || tempString.startsWith("  CREATE TABLE")) {tableName = tempString.split("\\.")(1).replaceAll(" ", "")sb.append("\n").append(tableName).append("|")} else if (tempString.indexOf("PRIMARY KEY") >= 0) {val pkName = tempString.split("\\(")(1).replaceAll(" ", "").replaceAll("\\)", "")sb.append("|").append(pkName)}else if (tempString.startsWith("   (") || tempString.startsWith(" (    ")) {val split = tempString.split("\\s+")sb.append(split(2)).append(",")}else if (tempString.startsWith("\t\"") || tempString.startsWith("\t")) {val split = tempString.split("\\s+")if (!("CONSTRAINT" == split(1)) && split.length >= 3) {sb.append(split(1)).append(",")}}}val sb2 = sb.toString().toLowerCase().replaceAll("\"", "").replaceAll(",\n", "\n").replaceAll(",\\|", "\\|").replaceAll("\\(\\|", "\\|")if (sb2.endsWith(",")) {sb2.substring(0, sb2.length() - 1)} else {sb2}}}

运行以上代码,输出如下:

config|no,configcode,configvalue|no,configcode

这篇关于解析oracle的DDL语句生成高斯内表及表字段主键配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/892748

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码