oracle表转mysql表 简单操作

SELECT F_LIMS_GET_SQL_FOR_MYSQL('tablename',0) FROM DUAL;

CREATE OR REPLACE FUNCTION F_LIMS_GET_SQL_FOR_MYSQL(PI_TABLENAME IN VARCHAR2,
                                                    PI_ISDROP    IN INTEGER := 1)
  RETURN CLOB IS
  FunctionResult clob;
  V_TABLENAME         VARCHAR(100);
  V_RET_SQL           VARCHAR2(4000);
  V_SQL_HEADER        VARCHAR2(1000);
  V_SQL_BODY          CLOB;
  V_SQL_INDEX         VARCHAR2(4000);
  V_SQL_NormalINDEX         VARCHAR2(4000);
  V_SQL_TABLE_COMMENT VARCHAR(400);
  V_SQL_PK_COL_LIST   VARCHAR(1000);
  -- 根据当前数据库和表名,生成mysql建表语句
BEGIN
  -- 表名统一为大写
  SELECT UPPER(PI_TABLENAME) INTO V_TABLENAME FROM DUAL;

  SELECT MAX(T.COMMENTS)
    INTO V_SQL_TABLE_COMMENT
    FROM USER_TAB_COMMENTS T
   WHERE T.TABLE_NAME = V_TABLENAME;

 -- SELECT MAX(LISTAGG('`' || A.COLUMN_NAME || '` ') within group (order by A.COLUMN_NAME))
    SELECT LISTAGG('`' || A.COLUMN_NAME || '` ',',') within group (order by A.position desc)
    INTO V_SQL_PK_COL_LIST
    FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
   WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
     AND B.CONSTRAINT_TYPE = 'P'
     AND A.TABLE_NAME = V_TABLENAME
   GROUP BY A.TABLE_NAME;

  V_SQL_HEADER := '-- ' || V_SQL_TABLE_COMMENT || ' 建表语句' || CHR(13);

  IF PI_ISDROP = 1 THEN
    V_SQL_HEADER := V_SQL_HEADER || 'DROP TABLE IF EXISTS `' || V_TABLENAME || '`;' ||
                    CHR(13);
  END IF;
  V_SQL_HEADER := V_SQL_HEADER || 'CREATE TABLE `' || V_TABLENAME || '`  (';

  -- 表列信息
  SELECT LISTAGG(CHR(13) || '`' || T.COLUMN_NAME || '` ' ||
                   (CASE
                      WHEN T.DATA_TYPE = 'VARCHAR2' OR T.DATA_TYPE = 'NVARCHAR2' THEN
                       'VARCHAR(' || T.DATA_LENGTH || ')'
                      WHEN T.DATA_TYPE = 'DATE' THEN
                       'DATETIME'
                      WHEN T.DATA_TYPE = 'CLOB' THEN
                       'MEDIUMTEXT'
                      WHEN T.DATA_TYPE = 'NUMBER' AND NVL(T.DATA_SCALE,0) = 0 THEN
                       'INT'
                      WHEN T.DATA_TYPE = 'NUMBER' AND NVL(T.DATA_SCALE,0) != 0 THEN
                       'DECIMAL(' || T.DATA_PRECISION || ',' || T.DATA_SCALE || ')'
                      WHEN T.COLUMN_NAME = 'ID' THEN
                       'VARCHAR(32)'
                      ELSE
                       T.DATA_TYPE
                    END) || DECODE(T.NULLABLE, 'N', ' NOT NULL ', '') ||
                   ' COMMENT ''' || TC.COMMENTS || ''',')
                   WITHIN GROUP (ORDER BY T.COLUMN_ID)
    INTO V_SQL_BODY
    FROM USER_TAB_COLUMNS T
    LEFT JOIN USER_COL_COMMENTS TC
      ON T.TABLE_NAME = TC.TABLE_NAME
     AND T.COLUMN_NAME = TC.COLUMN_NAME
   WHERE T.TABLE_NAME = V_TABLENAME
   ORDER BY T.COLUMN_ID;

  IF V_SQL_PK_COL_LIST IS NOT NULL THEN
    --V_SQL_BODY := V_SQL_BODY || ' ,' || CHR(13) || ' PRIMARY KEY (' ||
    V_SQL_BODY := V_SQL_BODY ||  CHR(13) || ' PRIMARY KEY (' ||
                  V_SQL_PK_COL_LIST || ')  ';
  END IF;

  -- 表备注
  V_SQL_BODY := V_SQL_BODY || CHR(13) || ') COMMENT = ''' ||
                V_SQL_TABLE_COMMENT || ''';' || CHR(13);

  -- 唯一索引
  SELECT (LISTAGG('@ALTER TABLE `' || A.TABLE_NAME ||
                    '` ADD UNIQUE INDEX (' ||
                    LISTAGG('`' || A.COLUMN_NAME || '`',',') within group (order by a.position) || ');@')
                    within group (order by a.TABLE_NAME))
    INTO V_SQL_INDEX
    FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
   WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
     AND B.CONSTRAINT_TYPE = 'U'
     AND A.TABLE_NAME = V_TABLENAME
   GROUP BY A.TABLE_NAME, A.CONSTRAINT_NAME;

  IF V_SQL_INDEX IS NOT NULL THEN
    V_SQL_INDEX := REPLACE(REPLACE(V_SQL_INDEX, '@,@', CHR(13)), '@', '');
    V_SQL_INDEX := '-- 创建索引' || CHR(13) || V_SQL_INDEX;
  END IF;

    -- 普通索引
  SELECT  (LISTAGG('@ALTER TABLE `' || A.TABLE_NAME ||
                    '` ADD  INDEX (' ||
                    LISTAGG('`' || A.COLUMN_NAME || '`',',') within group (order by A.column_position) || ');@')
                    within group (order by a.TABLE_NAME))
    INTO V_SQL_NormalINDEX
    FROM
    user_ind_columns A
  WHERE  table_name =V_TABLENAME and SUBSTR(A.INDEX_NAME , 1, 2)<>'PK'
  group by A.TABLE_NAME ,A.index_name;


  IF V_SQL_NormalINDEX IS NOT NULL THEN
    V_SQL_NormalINDEX := REPLACE(REPLACE(V_SQL_NormalINDEX, '@,@', CHR(13)), '@', '');
    V_SQL_NormalINDEX := '-- 创建索引' || CHR(13) || V_SQL_NormalINDEX;
  END IF;

  RETURN V_SQL_HEADER || V_SQL_BODY || V_SQL_INDEX || V_SQL_NormalINDEX;
  RETURN (FunctionResult);
END F_LIMS_GET_SQL_FOR_MYSQL;
 

  • 22
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在日常的数据处理和开发中,OracleMySQL两种数据库都是比较常用的。因为它们都有自己独特的优势和适用场景,所以我们可能经常会需要在这两种数据库之间进行数据的互通。而在实际操作中,我们经常要将在线Oracle语句转成MySQL语句。那么,如何进行转换呢? 首先我们需要知道的是,OracleMySQL两种数据库有些差异,比如在数据类型上,Oracle支持更多的数据类型,而MySQL则对于时间类型的处理较为方便,而在SQL语法上,OracleMySQL也有一些不同,因此,在进行在线Oracle语句转成MySQL语句时,我们需要注意一些细节问题。 其次,我们提供下面几个常用的在线转换工具供大家参考: 1. SQLines SQL Converter:这是一个专业的在线转换工具,可以将Oracle SQL转换成MySQL SQL、PostgreSQL SQL、SQL Server SQL等。使用该转换工具非常简单,只需将要转换的Oracle SQL语句输入到左侧文本框中,然后选择要转换成的目标类型和版本,再点击“转换”按钮即可完成转换。 2. SQLines Online Tool:这是另一个免费的在线转换工具,支持将Oracle SQL转换成MySQL SQL、PostgreSQL SQL、SQL Server SQL等。该工具还支持批量转换、分析SQL语句等功能,非常实用。 3. Convert Oracle to MySQL:这是一个免费的在线转换工具,支持将Oracle SQL转换成MySQL SQL。使用该工具非常简单,只需逐行粘贴Oracle SQL语句并按下“Convert”按钮即可。 最后需要注意的是,在进行在线Oracle语句转成MySQL语句时,需要注意数据类型的转换问题、函数和常见操作的差异,以及一些特殊语法的转换问题等。只有根据具体情况进行针对性的转换,才能确保转换的有效性和正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值