Oracle完整复制表结构信息流程与JAVA例子

本文详细介绍了在Oracle数据库中查看表存在性、表空间归属、创建表定义、添加表列注释、管理触发器、复制序列,以及提供Java示例。涵盖了表的全方位管理与迁移实践。

目录

一、查看表是否存在

二、表属于哪个表空间

三、数据表定义语句

四、表和列注释

1、获取表和列注释

2、添加表注释

3、添加列注释

五、触发器

 1、获取属于表的所有触发器名称

2、根据触发器名称查询触发器定义语句

3、创建触发器

六、复制序列

1、复制序列原因

2、序列含义

3、创建序列

七、Java例子

ORALCE所有的名称命名最好都是大写,防止出错

一、查看表是否存在

select count(1) COUNT from user_tables t where table_name= upper('表名')

查询得到大于0即存在

二、表属于哪个表空间

SELECT TABLESPACE_NAME FROM user_tables WHERE TABLE_NAME = upper('表名')

若查询为空,则说明表属于默认表空间,则执行下列语句可得到默认表空间

SELECT DEFAULT_TABLESPACE  FROM user_users

三、数据表定义语句

查看当前用户

SELECT username from USER_USERS

获取数据表定义语句

select dbms_metadata.get_ddl('TABLE',upper('表名'),(SELECT username from USER_USERS)) DDL from dual

注:表定义语句包含了主键等约束、分区定义等信息,不用在额外去获取主键等约束

由于获取表定义语句包含表的表空间和模式,转移到其他库,可能表空间和模式不一样,因此可用标识符替换,后面根据实际表空间和模式进行替换

如,后面会附上完整代码

/**
     * 获取数据表定义语句
     * @param runner sql执行器
     * @param tableName 表名
     * @param username 用户账号
     * @param tablespace 表空间
     * @return
     */
    public String getTableDdlSql(SqlRunner runner, String tableName, String username, String tablespace) {
        StringBuilder stringBuilder = new StringBuilder("select dbms_metadata.get_ddl('TABLE',upper('")
                                                .append(tableName)
                                                .append("')) DDL from dual ");
        try {
            CLOB ddl = (CLOB) runner.selectOne(stringBuilder.toString()).get("DDL");
            if(ddl != null){
                try(BufferedReader br = new BufferedReader(ddl.getCharacterStream())){
                    StringBuilder sb = new StringBuilder();
                    String line;
                    while ((line = br.readLine()) != null) {
                        sb.append(line);
                    }
                    //由于获取表定义语句包含表的表空间和模式,转移到其他库,可能表空间和模式不一样,因此用标识符替换,后面根据实际表空间和模式进行替换
                    return sb.toString().replaceFirst("CREATE TABLE \"" + username + "\".", "##USERNAME##")
                            .replaceAll("TABLESPACE \"" + tablespace + "\"", "##TABLESPACE##");
                }
               
            }else{
                //Exception("获取表[" + tableName + "]定义语句失败:定义语句为空");
            }
        }catch (SQLException | IOException e) {
            logger.error("获取表[" + tableName + "]定义语句失败", e);
            //Exception("获取表[" + tableName + "]定义语句失败" + e.getMessage());
        }
    }

四、表和列注释

1、获取表和列注释

--表注释
select comments from user_tab_comments where table_name= upper('表名')
--列注释 
select column_name,comments from user_col_comments where table_name= upper('表名')

2、添加表注释

  COMMENT ON TABLE '表名' IS '注释';

3、添加列注释

COMMENT ON COLUMN 表名.列名 IS '注释';

五、触发器

 1、获取属于表的所有触发器名称

select trigger_name from user_triggers where table_name=upper('表名')

2、根据触发器名称查询触发器定义语句

select text from user_source where type='TRIGGER' AND name='触发器名称' ORDER BY line

3、创建触发器

将查询出来的text按照顺序进行拼装并在开头加上"CREATE "

六、复制序列

1、复制序列原因

注:由于复制别的数据库中的表,可能存在要复制的数据库表的触发器使用该库自己的序列,而复制到本地的数据库中可能缺少对应的序列,导致对新增表中的数据进行操作会出现出错,因此复制表时也需将别的数据库用户拥有的序列复制到本地数据库用户中。

查询数据库用户拥有序列

SELECT * FROM user_SEQUENCES

2、序列含义

和mysql中使用auto_increme

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值