ORACLE 批量生成表,类似mysql的show create table

本文介绍了一种Java方法,用于从Oracle数据库获取简化版的表创建SQL,剔除多余信息如表空间,仅包含主键、索引、注释等,以TXT格式定时上传到FTP,便于第三方使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有个需求,需要将1-200张表上传给第三方,每天定时抽取前一天的数据,生成TXT文件上传到FTP上,还需要将建表语句给他们。 。

oracle没有show create table能够直接显示建表语句,有个

dbms_metadata.get_ddl('TABLE','TABLE_NAME') 这个存过能生成,但是里面还有表空间等信息,还有些多余的信息,似乎不太满足,类似这样

 于是重新用java编写了下。

废话不多说,直接上代码


package com.asiainfo.crm.ftp.util;

import java.sql.Connection;
import java.util.Hashtable;
import java.util.List;

public class ShowCreateTable extends DBUtils{
	
	public static final String password = "xxx";// test#1234   ct04_a1234
	public static final String username = "xxxx";
	public static final String url = "jdbc:oracle:thin:@ip:1621:xxx";
 	public static final String driver = "oracle.jdbc.driver.OracleDriver";


	public static void main(String[] args) throws Exception {
		ShowCreateTable t = new ShowCreateTable();
		
		Connection conn = t.getConnection(driver,url,username,password);
 
		String sql = t.createTableSql(conn, "owner", "tablename");
		System.out.println(sql);
		t.closeConn(conn);
	}
	
	private  String createTableSql(Connection conn,String owner,String tablename) throws Exception{
		StringBuffer sb = new StringBuffer("create table ");
		sb.append(owner).append(".").append(tablename);
		sb.append("(");
		sb.append("\r");
//查询表所有列,按照顺序生成
		String sql = "SELECT * FROM DBA_TAB_COLS R  WHERE r.TABLE_NAME = '"+tablename+"' AND R.OWNER='"+owner+"' ORDER BY R.COLUMN_ID";
        List<Hashtable<String, String>> list = this.getResultBySQL(conn, sql, null);		
        int index = 0;
        for(Hashtable<String, String> h : list){
        	sb.append(h.get("COLUMN_NAME")).append(" ").append(h.get("DATA_TYPE"));
        	if(h.get("DATA_TYPE").equals("DATE") || h.get("DATA_TYPE").equals("TIMESTAMP")){
        		
        	}else if(h.get("DATA_TYPE").equals("NUMBER")){
        		sb.append("(").append(h.get("DATA_PRECISION")).append(")");
        	}else if(h.get("DATA_TYPE").equals("VARCHAR")||h.get("DATA_TYPE").equals("CHAR") || h.get("DATA_TYPE").equals("VARCHAR2")){
        		sb.append("(").append(h.get("DATA_LENGTH")).append(")");
        	}
        	
        	if(h.get("NULLABLE").equals("N")){
        		sb.append(" not null ");
        	}
        	index++;
        	if(index<list.size()){
        		sb.append(",");
        	}
        	sb.append("\r");
        }
		sb.append(");");
		sb.append("\r");
		

//查询表所有的comment
		sql = "SELECT COMMENTS FROM DBA_TAB_COMMENTS R  WHERE r.TABLE_NAME = '"+tablename+"' AND R.OWNER='"+owner+"'";
		List<String> comments = this.getListStrBySQL(conn, sql, null);
		if(comments!=null && comments.size()>0){
			sb.append(" COMMENT ON TABLE ").append(owner).append(".").append(tablename).append(" is '").append(comments.get(0)).append("'");
			sb.append(";");
			sb.append("\r");
		}
		
//查询列的comment
		sql = "SELECT COLUMN_NAME,comments FROM dba_col_comments R  WHERE  r.TABLE_NAME = '"+tablename+"' AND R.OWNER='"+owner+"'";
		List<Hashtable<String, String>> colComments = this.getResultBySQL(conn, sql, null);
		if(colComments!=null && colComments.size()>0){
			for(int i=0;i<colComments.size();i++){
				Hashtable<String, String> h = colComments.get(i);
				sb.append(" COMMENT ON COLUMN ").append(owner).append(".").append(tablename).append(".").append(h.get("COLUMN_NAME")).append(" is '").append(h.get("COMMENTS")).append("'");
				sb.append(";");
				sb.append("\r");
			}
			
		}
		
//生成索引
		sql = "select index_name,COLUMN_NAME FROM dba_ind_columns  r  WHERE r.TABLE_NAME = '"+tablename+"' AND R.TABLE_OWNER='"+owner+"'";
		List<Hashtable<String, String>> indexList = this.getResultBySQL(conn, sql, null);
		if(indexList!=null && indexList.size()>0){
			for(int i=0;i<indexList.size();i++){
				Hashtable<String, String> h = indexList.get(i);
				if(!h.get("INDEX_NAME").startsWith("PK_")){
					sb.append("create index ").append(owner).append(".").append(h.get("INDEX_NAME")).append(" ON ").append(owner).append(".").append(tablename).append("(").append(h.get("COLUMN_NAME")).append(");");
					sb.append("\r");
				} 
			}
		}
		
		//生成主键
		sql = "select   a.constraint_name,a.column_name from DBA_cons_columns a, DBA_constraints b where a.constraint_name = b.constraint_name and A.table_name = B.table_name AND A.owner = B.owner AND   b.constraint_type = 'P' and a.table_name = '"+tablename+"' AND A.owner = '"+owner+"' ORDER BY a.position";
		List<Hashtable<String, String>> pkList = this.getResultBySQL(conn, sql, null);
		if(pkList!=null && pkList.size()>0){
			String str = "";
			String constraintName = "";
			for(int i=0;i<pkList.size();i++){
				Hashtable<String, String> h = pkList.get(i);
				if(i==pkList.size()-1){
					 str += h.get("COLUMN_NAME");
				}else{
					 str += h.get("COLUMN_NAME")+",";
				}
				constraintName = h.get("CONSTRAINT_NAME");
			}
			sb.append("alter table ").append(owner).append(".").append(tablename).append(" add constraint ").append(constraintName).append(" primary key  (").append(str).append(") ;");
			sb.append("\r");
		}
		return sb.toString();
	}
	
	 //外键没有生成,懒得生成了
}

最终生成的效果就比较清爽,包含了主键,索引,comment,非空等信息

<think>嗯,用户想知道如何用SQL命令显示ex_team的创建语句。首先,我记得在MySQL中,查看的创建语句通常使用SHOW CREATE TABLE命令。这个命令会返回建时的完整SQL语句,包括的结构、引擎、字符集等信息。 那具体该怎么写呢?应该是SHOW CREATE TABLE后面跟上名。比如用户有ex_team,那么命令就是SHOW CREATE TABLE ex_team;。执行之后,MySQL会返回两列,一列是名,另一列是Create Table语句,里面详细列出了字段、索引、引擎等参数。 不过要注意权限问题。用户需要有对该的查询权限,否则可能会报错。另外,如果在特定的数据库中,可能需要先切换到那个数据库,或者使用数据库名作为前缀,比如SHOW CREATE TABLE database_name.ex_team;。这样可以确保访问的是正确的数据库中的。 然后,用户可能需要复制这个结果,或者导出到其他地方。在命令行中直接运行的话,结果可能格式不太友好,可以考虑使用客户端工具如MySQL Workbench,或者结合其他命令格式化输出。比如在命令行中使用\G来垂直显示结果,这样更易读:SHOW CREATE TABLE ex_team \G。 另外,用户提到的参考引用里有Oracle的链接,可能用户也在考虑其他数据库的情况。但SHOW CREATE TABLE主要是MySQL和MariaDB的语法。如果是Oracle的话,可能需要查询数据字典视图,比如USER_TABLES或ALL_TAB_COLUMNS,或者使用DBMS_METADATA.GET_DDL来获取DDL语句。不过用户的问题明确提到使用SHOW CREATE TABLE,所以应该是在MySQL环境下。 最后,要提醒用户注意版本差异。不同版本的MySQL可能在显示结果上略有不同,比如默认引擎或者字符集的变化。此外,如果有视图或特殊存储引擎的SHOW CREATE TABLE也会反映出来。总之,确保命令正确,权限足够,就能成功获取ex_team的创建语句了。</think>要查看MySQL中$ex\_team$的创建语句,可以通过以下步骤实现: ### 1. 使用`SHOW CREATE TABLE`命令 执行SQL命令: ```sql SHOW CREATE TABLE ex_team; ``` 该命令会返回两列数据: - **Table**:名$ex\_team$ - **Create Table**:完整的建语句,包含字段定义、索引、引擎类型等信息[^1] ### 2. 输出示例 ```sql +----------+--------------------------------------------------------------+ | Table | Create Table | +----------+--------------------------------------------------------------+ | ex_team | CREATE TABLE `ex_team` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +----------+--------------------------------------------------------------+ ``` ### 3. 注意事项 - 需要具有该的`SELECT`权限 - 如果在其他数据库,需指定数据库名前缀: ```sql SHOW CREATE TABLE database_name.ex_team; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值