了解 Oracle 的 ALL_TAB_COLUMNS

kep*_*onk 6 oracle metadata information-schema

我是 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;
Run Code Online (Sandbox Code Playgroud)

给出输出:

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
Run Code Online (Sandbox Code Playgroud)

为什么每列重复3次?为什么datatypelength不同UIDPK,为什么NULLABLE不一样?

a_h*_*ame 6

很可能有三个模式(用户)包含该表。您需要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 检索表的完整定义:

SELECT dbms_metadata.get_ddl('TABLE', 'EMPLOYEE', 'SCOTT')
FROM dual;
Run Code Online (Sandbox Code Playgroud)