如何使用 jdbc 在 teradata 上获取表创建脚本?

Posted

技术标签:

【中文标题】如何使用 jdbc 在 teradata 上获取表创建脚本?【英文标题】:How can I get table creation scripts on teradata with jdbc? 【发布时间】:2013-07-15 06:58:44 【问题描述】:

我想用 jdbc 在 teradata 上获取表创建脚本。 我使用了在***上找到的这段代码:

   StringBuilder sb = new StringBuilder( 1024 );
                if ( columnCount > 0 )  
                    sb.append( "Create table ").append( rsmd.getTableName( 1 )  ).append( " ( " );
                
                for ( int i = 1; i <= columnCount; i ++ ) 
                    if ( i > 1 ) sb.append( ", " );
                    String columnName = rsmd.getColumnLabel( i );
                    String columnType = rsmd.getColumnTypeName( i );

                    sb.append( columnName ).append( " " ).append( columnType );

                    int precision = rsmd_ddl.getPrecision( i );
                    if ( precision != 0 ) 
                        sb.append( "( " ).append( precision  ).append( " )" );
                    
                 // for columns
                sb.append( " ) " );

但问题是:当类型为 VARCHAR 时,精度为 0 但在 teradata 中,列为 VARCHAR(100) 但我怎样才能找到 100

谢谢。

【问题讨论】:

【参考方案1】:

getPrecision 用于小数,您应该使用 getColumnDisplaySize 用于字符。

Teradata JDBC 参考中有很多示例: http://developer.teradata.com/doc/connectivity/jdbc/reference/current/frameset.html

示例 T20100JD 展示了如何提取元数据。

【讨论】:

【参考方案2】:

getPrecision 用于小数,您应该使用 getColumnDisplaySize 用于字符

Teradata 在他们的 JDBC 驱动程序实现中存在缺陷/错误,因为他们没有正确实现接口的契约。

接口 java.sql.ResultSetMetaData 的 Java API 文档明确定义了具有不同数据类型的 getPrecision() 方法的预期行为:


int getPrecision(int column)
                 throws SQLException

Get the designated column's specified column size. 
For numeric data, this is the maximum precision. 
For character data, this is the length in characters. 
...

当为 VARCHAR 列调用 getPrecision() 时,Teradata JDBC 驱动程序错误地返回 0。因此,在使用 Teradata JDBC 时,必须使用 getColumnDisplaySize()。

【讨论】:

以上是关于如何使用 jdbc 在 teradata 上获取表创建脚本?的主要内容,如果未能解决你的问题,请参考以下文章

Sqoop从Presto数据库,[Teradata的] [JDBC](11975)不支持的事务隔离等级:2

JDBC的ResultSet游标转spark的DataFrame,数据类型的映射以TeraData数据库为例

如何使用 JDBC 在 Spark 中的其他数据库中获取表的创建语句

如何使用普通 JDBC 获取目标表的名称和外键列的列

teradata建表DDL

如何过滤掉 teradata 文本字段中的非数字值?