一般来说,我是 Oracle 和数据库管理的新手。
作为上下文,我想创建一个 Java 类,它可以为我提供使用DESC SOME_TABLE
.
我在 Java 中找不到任何具体的方法,但是我发现这ALL_TAB_COLUMNS
可以给我类似的信息。我在 SQL Developer 中尝试过,看看输出有多么不同。事实证明,结果与我预期的大不相同。
我希望有人可以指导我如何解释以下内容:
desc SOME_TABLE;
select
COLUMN_NAME
, DATA_TYPE
, DATA_LENGTH
, NULLABLE
from ALL_TAB_COLUMNS
where TABLE_NAME='SOME_TABLE'
order by column_id;
给出输出:
Name Null Type
--------------- ------- ----------------------
UIDPK NUMBER(20)
NAME VARCHAR2(255)
2 rows selected
COLUMN_NAME DATA_TYPE DATA_LENGTH NULLABLE
--------------- -------------- -------------- --------
UIDPK NUMBER 22 N
UIDPK NUMBER 22 N
UIDPK NUMBER 22 Y
NAME VARCHAR2 255 N
NAME VARCHAR2 255 Y
NAME VARCHAR2 255 N
6 rows selected
为什么每列重复3次?为什么datatype
和length
不同UIDPK
,为什么NULLABLE
不一样?
很可能存在三个包含该表的模式(用户)。您需要
OWNER = 'FOOBAR'
在查询中包含 all_tab_columns (或使用user_tab_columns
)。您还可以OWNER
在选择列表中包含该列以验证这一点。对于
VARCHAR
(和其他字符列),大小CHAR_LENGTH
按照手册中的说明存储。请注意,您还需要检查CHAR_USED
定义是字节还是字符(VARCHAR(10 Bytes)
vs.VARCHAR(10 Char)
)。对于数字列,定义存储在
DATA_SCALE
和中DATA_PRECISION
。这在手册中都有描述:http: //docs.oracle.com/cd/E11882_01/server.112/e25513/statviews_2103.htm#I1020277
您是否知道您可以使用 SELECT 语句使用 `DBMS_METADATA 检索表的完整定义:
ALL_TAB_COLUMNS
正在向您显示您可以访问的所有表格,而不仅仅是您拥有的表格。我猜想在您的应用程序数据库存在的服务器上存在三个模式。USER_TAB_COLUMNS
将只向您显示您拥有的表(即仅模式中属于您登录的用户的表)。如果您以 DBA 登录名连接,您可以看到另一组数据字典视图
DBA_*
,它们包含实例上的所有对象,无论所有权如何。这不是对您问题的回答,而是对您的声明的评论,即您没有找到直接在 java 中检索有关 tablecolumns 信息的可能性。java 以独立于数据库的方式提供此信息。
Javadoc:java.sql,接口 DatabaseMetaData,getColumns: