【问题标题】:make DBMS_METADATA.GET_DDL Pretty with identation使用缩进使 DBMS_METADATA.GET_DDL 漂亮
【发布时间】:2016-05-29 20:48:00
【问题描述】:

我正在尝试使用 JAVA 调用生成 DDL:

DBMS_METADATA.GET_DDL;
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',TRUE);

它工作得很好,但它给了我类似的东西:

CREATE TABLE "DEPARTMENTS"   
(   "DEPARTMENT_ID" NUMBER(4,0),    
    "DEPARTMENT_NAME" VARCHAR2(30),    
    "MANAGER_ID" NUMBER(6,0),    
    "LOCATION_ID" NUMBER(4,0)   
);   
CREATE INDEX "DEPT_LOCATION_IX" ON "DEPARTMENTS" ("LOCATION_ID");

我想要类似的东西:

CREATE TABLE "DEPARTMENTS"
(
    "DEPARTMENT_ID"   NUMBER(4,0),
    "DEPARTMENT_NAME" VARCHAR2(30),
    "MANAGER_ID"      NUMBER(6,0),
    "LOCATION_ID"     NUMBER(4,0)
);
CREATE INDEX "DEPT_LOCATION_IX" ON "DEPARTMENTS" ("LOCATION_ID");

【问题讨论】:

  • 你能解释一下你为什么想要这个吗?并不是说这是一个不合理的要求,而是DBMS_METADATA.GET_DDL 中还有一些其他的惊喜可能使它不适合你正在做的事情。例如,如果您使用输出来比较架构或作为穷人的版本控制,重要的是要知道输出甚至并不总是以相同的顺序打印。
  • IDE 之类的 SQLDEVELOPER 提供了格式化代码的选项。你也可以试试。
  • 您对LINESIZE、LONG 和LONGCHUNKSIZE 有什么帮助吗!!!

标签: java plsql oracle10g ddl dbms-metadata


【解决方案1】:

不是最好的答案,但由于我使用的是 java,我可以尝试 printf 来对齐列的类型:

pwFile.printf("%-45s %s,\n", columnsName.get(i), columnsType.get(i))

此方法将表格的 DDL 写入文件,使列小写并对齐它们的类型:

 public static void writeTableDDL(String table) throws SQLException {
    Connection con = null;

    PreparedStatement preparedStatement = null;
    String filename = table.toUpperCase()+".sql";
    PrintWriter pwFile = null;
    ArrayList<String> columnsName = new ArrayList<String>() ;
    ArrayList<String> columnsType = new ArrayList<String>() ;
    ArrayList<String> columnsNullable = new ArrayList<String>() ;


    String selectSQL ="SELECT column_name , DECODE(nullable, 'Y', ' ', 'NOT NULL') nullable , " +
            " DECODE(data_type, 'RAW', data_type || '(' ||  data_length || ')', 'CHAR', data_type || '(' ||  data_length || ')', 'VARCHAR',  data_type || '(' ||  data_length || ')', 'VARCHAR2', data_type || '(' ||  data_length || ')', 'NUMBER', NVL2(   data_precision, DECODE( data_scale, 0, data_type || '(' || data_precision || ')' , data_type || '(' || data_precision || ',' || data_scale || ')'), data_type), data_type ) data_type "
            + " FROM user_tab_columns WHERE table_name = '"+table+"' ORDER BY column_id";

try 
{
    con = DBConnection.getConnection();
    preparedStatement = con.prepareStatement(selectSQL);
    ResultSet rs = preparedStatement.executeQuery();

    while (rs.next()) {

       columnsName.add(rs.getString(1));
       columnsType.add(rs.getString(3));
       columnsNullable.add(rs.getString(2));
    }
}catch (SQLException e) {
    System.out.println(e.getMessage());
} finally {
    if (preparedStatement != null) {
        preparedStatement.close();
    }
    if (con != null) {
        con.close();
    }
}

try {
    pwFile = new PrintWriter(filename);     
    pwFile.println("CREATE TABLE "+table+"\n(");

    for(int i=0; i <= columnsName.size()-1; i++) {
        columnsName.set(i, columnsName.get(i).toLowerCase());
    }

    for(int i=0; i < columnsName.size()-1; i++) {
          pwFile.printf("%-45s %s,\n", columnsName.get(i), columnsType.get(i));
    }

    pwFile.printf("%-45s      %s\n", columnsName.get(columnsName.size()-1), columnsType.get(columnsName.size()-1));
      pwFile.print(")\nTABLESPACE "+getTablespace(table)+"\n/");
} catch(FileNotFoundException e) {
  e.printStackTrace();
} catch(SecurityException e) {
  e.printStackTrace();
} finally {
  if(pwFile != null){
      pwFile.close();
  }
}
}   

【讨论】:

  • 嗨。请不要只是转储代码作为答案,请解释您的想法,以便用户更好地了解正在发生的事情。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多