java程序中获取oracle数据库中列的相关信息,通过在网上查询,找到了两种方法。
1.通过查询oracle中的DBA_TAB_COLS表
表名: DBA_TAB_COLS
OWNER
TABLE_NAME 表、视图或聚簇名
COLUMN_NAME 列名
DATA_TYPE 列数据类型
DATA_TYPE_MOD
DATA_TYPE_OWNER
DATA_LENGTH 列最大长度
DATA_PRECISION Number数据类型的十进制精度 ,Float数据类型的二进制精度 ,对其他数据类型则为 NULL
DATA_SCALE 小数点右边位数
NULLABLE 列是否可为空,如果列有非空约束或该列为关键字一部分则该值为 N
COLUMN_ID 列创建序列号
DEFAULT_LENGTH 当前列宽度
DATA_DEFAULT 列默认值
NUM_DISTINCT
LOW_VALUE 本字段和下一字段为:对三行以上的表,该列的第二小或第二大的值,对三行或少于三行的表,即为最小和最大值。该统计值为前 32字节的 16进制表示法
HIGH_VALUE 同上一字段
DENSITY
NUM_NULLS
NUM_BUCKETS
LAST_ANALYZED
SAMPLE_SIZE
CHARACTER_SET_NAME
CHAR_COL_DECL_LENGTH
GLOBAL_STATS
USER_STATS
AVG_COL_LEN
2.使用ResultSetMetaData类
方法摘要 | |
---|---|
String | getCatalogName (int column) 获取指定列的表目录名称。 |
String | getColumnClassName (int column) 如果调用方法 ResultSet.getObject 从列中检索值,则返回构造其实例的 Java 类的完全限定名称。 |
int | getColumnCount () 返回此 ResultSet 对象中的列数。 |
int | getColumnDisplaySize (int column) 指示指定列的最大标准宽度,以字符为单位。 |
String | getColumnLabel (int column) 获取用于打印输出和显示的指定列的建议标题。 |
String | getColumnName (int column) 获取指定列的名称。 |
int | getColumnType (int column) 检索指定列的 SQL 类型。 |
String | getColumnTypeName (int column) 检索指定列的数据库特定的类型名称。 |
int | getPrecision (int column) 获取指定列的小数位数。 |
int | getScale (int column) 获取指定列的小数点右边的位数。 |
String | getSchemaName (int column) 获取指定列的表模式。 |
String | getTableName (int column) 获取指定列的名称。 |
boolean | isAutoIncrement (int column) 指示是否自动为指定列进行编号,这样这些列仍然是只读的。 |
boolean | isCaseSensitive (int column) 指示列的大小写是否有关系。 |
boolean | isCurrency (int column) 指示指定的列是否是一个哈希代码值。 |
boolean | isDefinitelyWritable (int column) 指示在指定的列上进行写操作是否明确可以获得成功。 |
int | isNullable (int column) 指示指定列中的值是否可以为 null。 |
boolean | isReadOnly (int column) 指示指定的列是否明确不可写入。 |
boolean | isSearchable (int column) 指示是否可以在 where 子句中使用指定的列。 |
boolean | isSigned (int column) 指示指定列中的值是否带正负号。 |
boolean | isWritable (int column) 指示在指定的列上进行写操作是否可以获得成功。 |
两种方法都可以达到目的。但是在获取列的最大允许字符长度上出现了一些问题。经过实验得知,DBA_TAB_COLS表的data_length给的是当前列所属数据类型的最大长度,而不是列的最大允许字符长度,比如number型的数据,给出的值是22,而实际允许长度却是10。而DATA_PRECISION则只能给出number,float类型数据的最大允许字符长度,对于其他类型的数据全是null。相比之下ResultSetMetaData类的返回值则可以给出满意的答案。getColumnDisplaySize方法给出的是列所属类型的最大长度,和data_length一样。
而 getPrecision 方法则可以返回列的最大允许字符长度,其中,date型的返回0,定义类型的时候date是不需要定义长度的)。