oracle 与desc相似的,Oracle中和MYSQL show create table tablename,desc tablename,show tables, show databases

本文介绍如何在 Oracle 数据库中设置 SQL 输出格式以确保完整显示查询结果,并提供了从 Oracle 中获取表创建语句的方法,这对于从 MySQL 迁移到 Oracle 的场景特别有用。

参考:https://blog.youkuaiyun.com/weixin_42200829/article/details/116539487
oracle命令执行之前需要设置下输出格式,不然结果会显示不全

SET LONG 1000;

SET PAGESIZE 0;

在对MYSQL移植到Oracle时 数据库一些专有写法的差异进行备注。

  1. show create table tablename;

Oracle:

select table_name,dbms_metadata.get_ddl(‘TABLE’,‘TABLE_NAME’)from dual,user_tables where table_name=‘TABLE_NAME’;

eg:

select table_name,dbms_metadata.get_ddl(‘TABLE’,‘C’)from dual,user_tables where table_name=‘C’;

注意:TABLE_NAME 指表名 需要大写。

### 动态创建表的实现方式 在 MyBatis Plus 中,无法直接通过框架本身根据 `SHOW CREATE TABLE` 的结果动态创建表,但可以通过执行原始 SQL 语句来实现这一功能。MyBatis Plus 提供了对自定义 SQL 的支持,可以结合 `@Select` 或 `@Update` 注解执行建表语句。 #### 执行动态建表 首先,获取目标表的建表语句,例如通过 `SHOW CREATE TABLE` 获取 `device_311` 的结构信息。然后,将该 SQL 语句在目标数据库中执行,即可实现动态建表。 以下是一个示例: ```java @Mapper public interface DynamicTableMapper { @Select("SHOW CREATE TABLE ${tableName}") Map<String, Object> getCreateTableStatement(@Param("tableName") String tableName); @Update("${createTableSql}") void createTable(@Param("createTableSql") String createTableSql); } ``` #### Service 层逻辑 在 Service 层中,首先调用 `getCreateTableStatement` 获取建表语句,然后调用 `createTable` 方法执行建表操作: ```java @Service public class DynamicTableService { @Autowired private DynamicTableMapper dynamicTableMapper; public void createTableFromExisting(String sourceTableName, String targetTableName) { Map<String, Object> result = dynamicTableMapper.getCreateTableStatement(sourceTableName); if (result != null && result.containsKey("Create Table")) { String createTableSql = result.get("Create Table").toString().replace(sourceTableName, targetTableName); dynamicTableMapper.createTable(createTableSql); } } } ``` 上述代码中,`replace(sourceTableName, targetTableName)` 用于将原始建表语句中的表名替换为目标表名,从而实现动态建表的功能[^1]。 #### 示例输出 假设 `SHOW CREATE TABLE device_311` 返回如下语句: ```sql CREATE TABLE `device_311` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `status` int DEFAULT NULL, `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ``` 执行 `createTableFromExisting("device_311", "device_312")` 后,将生成如下建表语句并执行: ```sql CREATE TABLE `device_312` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `status` int DEFAULT NULL, `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ``` #### 注意事项 - 动态拼接 SQL 时应确保目标表名是可信的,以防止 SQL 注入攻击。 - 如果数据库中已存在目标表,执行建表语句时会抛出异常,建议在执行前先检查表是否存在。 - 该方法适用于 MySQL 数据库,其他数据库(如 PostgreSQL)需使用不同的语句或工具实现动态建表。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值