利用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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值