首页 > 数据库 >解析oracle的DDL语句生成高斯内表及表字段主键配置

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

时间:2024-04-10 22:33:02浏览次数:31  
标签:varchar String val replaceAll split DDL oracle 主键 append

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.oracle2gauss

import 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 StringBuilder
    var colCnt = 0
    var pkCols: String = ""
    for (line <- lines if line != null) {
      if (line.startsWith("CREATE TABLE") || line.startsWith("  CREATE TABLE") || line.startsWith("  CREATE TABLE")) {
        colCnt = colCnt + 1
        val 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.oracle2gauss

import 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 StringBuilder
    var tableName: String = null
    for (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

标签:varchar,String,val,replaceAll,split,DDL,oracle,主键,append
From: https://blog.csdn.net/weixin_45547818/article/details/137613559

相关文章

  • Oracle 替代变量
    替代变量说明在Oracle命令行中默认&为替代变量,只要在执行的sql中出现&符号,那么&符号后面的sql则会失效;这就意味着,包含&符号的sql将不会正确的执行比如:insertintoXXX_DB.XXX_TABLE(COLUMN1,COLUMN2)value('AB&CD','EF&GH');在不关闭替代变量的情况下,数据库中的数据将不会......
  • Oracle 替代变量
    替代变量说明在Oracle命令行中默认&为替代变量,只要在执行的sql中出现&符号,那么&符号后面的sql则会失效;这就意味着,包含&符号的sql将不会正确的执行比如:insertintoXXX_DB.XXX_TABLE(COLUMN1,COLUMN2)value('AB&CD','EF&GH');在不关闭替代变量的情况下,数据库中的数据将不会......
  • windows 环境下使用脚本备份 oracle 数据库数据
    @echooffecho================================================echoWindows环境下Oracle数据库的自动备份脚本echo1.使用当前日期命名备份文件。echo2.自动删除7天前的备份。echo================================================echo以“YYYYMMDD”格......
  • Oracle分析函数- count()/sum() over(partition by 分组 order by 排序) 详解
    优点:代码简单明了,并且执行效率高,(不影响总的记录数)如果不用这种函数去写,按照平时我们的思路首先想到的可能是子查询,那么将至少会走4次以上的全表扫描:(1)每个订单中产品数量大于3的产品至少1个(003,004)(2)每个订单中折扣标志为'1'的产品至少有2个(002,004)(3)每个订单......
  • Oracle数据表搬迁到openGauss
    Oracle数据表搬迁到openGauss搬迁方法Oracle数据表搬迁到openGauss数据库比较容易想到的两个工具是oracle_fdw及Ora2Pg。oracle_fdworacle_fdw是嵌入在目标端数据库里的一个扩展插件,允许在目标端数据库里访问其他异构数据库的表,openGauss数据库目前也支持这一插件。......
  • java连接Oracle(JDBC)
    packagetext.coming;importjava.sql.*;publicclassdemo{publicstaticvoidmain(String[]args){Connectionct=null;Statementstatement=null;try{Class.forName("oracle.jdbc.driver.OracleDriver");......
  • 默认值和主键
    --1.切换到master数据库usemastergo--2.检查删除数据库ifexists(select*fromsys.sysdatabaseswherename='student')dropdatabasestudentgo--3.按照四个步骤创建student数据库createdatabasestudenton(name=student_data,filename='c:\student\student_data......
  • Oracle 获取视图的DDL
    version:OracleDatabase10gEnterpriseEditionRelease10.2.0.4.0通过sqlplus获取视图的DDL的两种方法先设置格式setline233pages233long9999通过all_views/dba_views视图selecttextfromdba_viewswhereview_name='V_$DATABASE';TEXT-------------......
  • C#使用PaddleOCR进行图片文字识别✨
    PaddlePaddle介绍✨PaddlePaddle(飞桨)是百度开发的深度学习平台,旨在为开发者提供全面、灵活的工具集,用于构建、训练和部署各种深度学习模型。它具有开放源代码、高度灵活性、可扩展性和分布式训练等特点。PaddlePaddle支持端到端的部署,可以将模型轻松应用于服务器、移动设备和边缘......
  • 民航电子数据库:表主键为自增,insert时报错:[E16005] 字段xxx不能取空值
    目录一、场景二、报错信息三、排查四、原因五、解决一、场景1、对接民航电子数据库2、表的主键为自增主键,使用mybatis封装好的insert方法新增记录时报错二、报错信息###Errorupdatingdatabase.Cause:java.sql.SQLException:[E16005]字段ID不能取空值......