利用PLSQL导出ORACLE中的索引和主键,外键DDL语句 生成mysql索引

2022/4/26 2:12:35

本文主要是介绍利用PLSQL导出ORACLE中的索引和主键,外键DDL语句 生成mysql索引,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

利用PLSQL导出ORACLE中的索引和主键,外键DDL语句

在数据库迁移过程中,如果能够获取到表的主键和索引信息的创建DDL语句,那将大大方便了我们的迁移过程。

当然了,也可以利用如数据泵之类的工具来直接导出对应的信息,但是不必直接获取对应的ddl来的方便。

但是传统的方法采用DBMS_METEDATA.GET_DDL包来获取对应的DDL语句,也受限于DDL语句的长度,如果语句长度太长,则显示不完整。

下面分享一条语句可以直接将对应的DDL语句获取出来。

SELECT
        T.TABLE_NAME                 , --表名
        T.INDEX_NAME                 , --索引名
        I.UNIQUENESS                 , --是否非空
        I.INDEX_TYPE                 , --索引类型
        C.CONSTRAINT_TYPE            , --键类型
        WM_CONCAT(T.COLUMN_NAME) COLS,
        (CASE WHEN C.CONSTRAINT_TYPE = 'P' OR C.CONSTRAINT_TYPE = 'R' THEN --主键和外键创建脚本拼接
                                'ALTER TABLE '
                                || T.TABLE_NAME
                                || ' ADD CONSTRAINT '
                                || T.INDEX_NAME
                                || (CASE WHEN C.CONSTRAINT_TYPE = 'P' THEN ' PRIMARY KEY (' ELSE ' FOREIGN KEY (' END)
                                || WM_CONCAT(T.COLUMN_NAME)
                                || ');' ELSE --索引创建脚本拼接
                                'CREATE '
                                || (CASE                                 WHEN I.UNIQUENESS = 'UNIQUE' THEN I.UNIQUENESS
                                                        || ' ' ELSE CASE WHEN I.INDEX_TYPE = 'NORMAL' THEN '' ELSE I.INDEX_TYPE
                                                                        || ' ' END END)
                                || 'INDEX '
                                || T.INDEX_NAME
                                || ' ON '
                                || T.TABLE_NAME
                                || '('
                                || WM_CONCAT(COLUMN_NAME)
                                || ');' END) SQL_CMD --拼接创建脚本
FROM
        USER_IND_COLUMNS T,
        USER_INDEXES I    ,
        USER_CONSTRAINTS C
WHERE
        T.INDEX_NAME = I.INDEX_NAME
    AND T.INDEX_NAME = C.CONSTRAINT_NAME(+)
--    AND T.TABLE_NAME LIKE 'TB_%'                --自建表规则(只查询自己创建的表【我的建表规则以TB_开头】,排除系统表)
    AND I.INDEX_TYPE != 'FUNCTION-BASED NORMAL' --排除基于函数的索引
GROUP BY
        T.TABLE_NAME,
        T.INDEX_NAME,
        I.UNIQUENESS,
        I.INDEX_TYPE,
        C.CONSTRAINT_TYPE;

 

 

拼接成mysql的脚本

SELECT
T.TABLE_NAME , --表名
T.INDEX_NAME , --索引名
I.UNIQUENESS , --是否非空
I.INDEX_TYPE , --索引类型
C.CONSTRAINT_TYPE , --键类型
WM_CONCAT(T.COLUMN_NAME) COLS,
(CASE WHEN C.CONSTRAINT_TYPE = 'P' OR C.CONSTRAINT_TYPE = 'R' THEN --主键和外键创建脚本拼接
'ALTER TABLE '
|| T.TABLE_NAME
|| ' ADD CONSTRAINT '
|| T.INDEX_NAME
|| (CASE WHEN C.CONSTRAINT_TYPE = 'P' THEN ' PRIMARY KEY (' ELSE ' FOREIGN KEY (' END)
|| WM_CONCAT(T.COLUMN_NAME)
|| ');' ELSE --索引创建脚本拼接 ALTER TABLE `FBP_SET_OF_BOOK` ADD INDEX FBP_CUSTOMER_COMPANY_IDX1 (`SOB_CODE`);--UNIQUE
'ALTER TABLE `'
|| T.TABLE_NAME
|| '` ADD '
|| (CASE WHEN I.UNIQUENESS = 'UNIQUE' THEN I.UNIQUENESS
|| ' ' ELSE 'INDEX ' END)

|| T.INDEX_NAME
|| '(`'
|| WM_CONCAT(COLUMN_NAME)
|| '`);' END) SQL_CMD --拼接创建脚本
FROM
USER_IND_COLUMNS T,
USER_INDEXES I ,
USER_CONSTRAINTS C
WHERE
T.INDEX_NAME = I.INDEX_NAME
AND T.INDEX_NAME = C.CONSTRAINT_NAME(+)
AND I.INDEX_TYPE != 'FUNCTION-BASED NORMAL' --排除基于函数的索引
AND T.COLUMN_NAME != 'ID'
AND (T.TABLE_NAME LIKE 'ERP_%' or T.TABLE_NAME LIKE 'FBP_%' or T.TABLE_NAME LIKE 'SIE_%' or T.TABLE_NAME LIKE 'WFW_%') --自建表规则(只查询自己创建的表【我的建表规则以TB_开头】,排除系统表)
AND (C.CONSTRAINT_TYPE != 'P' or C.CONSTRAINT_TYPE is null) --排除主键索引
GROUP BY
T.TABLE_NAME,
T.INDEX_NAME,
I.UNIQUENESS,
I.INDEX_TYPE,
C.CONSTRAINT_TYPE;



这篇关于利用PLSQL导出ORACLE中的索引和主键,外键DDL语句 生成mysql索引的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程