AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 21266
Accepted
keponk
keponk
Asked: 2012-07-21 13:54:40 +0800 CST2012-07-21 13:54:40 +0800 CST 2012-07-21 13:54:40 +0800 CST

了解 Oracle 的 ALL_TAB_COLUMNS

  • 772

一般来说,我是 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不一样?

oracle metadata
  • 3 3 个回答
  • 29558 Views

3 个回答

  • Voted
  1. Best Answer
    a_horse_with_no_name
    2012-07-21T23:06:32+08:002012-07-21T23:06:32+08:00

    很可能存在三个包含该表的模式(用户)。您需要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;
    
    • 6
  2. ConcernedOfTunbridgeWells
    2012-07-21T13:56:42+08:002012-07-21T13:56:42+08:00

    ALL_TAB_COLUMNS正在向您显示您可以访问的所有表格,而不仅仅是您拥有的表格。我猜想在您的应用程序数据库存在的服务器上存在三个模式。

    USER_TAB_COLUMNS将只向您显示您拥有的表(即仅模式中属于您登录的用户的表)。

    如果您以 DBA 登录名连接,您可以看到另一组数据字典视图DBA_*,它们包含实例上的所有对象,无论所有权如何。

    • 3
  3. miracle173
    2012-07-23T08:11:37+08:002012-07-23T08:11:37+08:00

    这不是对您问题的回答,而是对您的声明的评论,即您没有找到直接在 java 中检索有关 tablecolumns 信息的可能性。java 以独立于数据库的方式提供此信息。

    Javadoc:java.sql,接口 DatabaseMetaData,getColumns:

    ResultSet getColumns(字符串目录,
                       字符串模式模式,
                       字符串表名模式,
                       字符串列名模式)
                         throws SQLExceptionRetrieves 对指定目录中可用的表列的描述。
    仅返回与目录、架构、表和列名条件匹配的列描述。它们按 TABLE_CAT、TABLE_SCHEM、TABLE_NAME 和 ORDINAL_POSITION 排序。
    
    每个列描述都有以下列:
    
    1.TABLE_CAT String => 表目录(可以为空)
    2.TABLE_SCHEM String => 表模式(可能为空)
    3.TABLE_NAME String => 表名
    4.COLUMN_NAME String => 列名
    5.DATA_TYPE int => 来自 java.sql.Types 的 SQL 类型
    6.TYPE_NAME String => 数据源依赖类型名,对于UDT,类型名是全限定的
    7.COLUMN_SIZE int => 列大小。
    8.BUFFER_LENGTH 未使用。
    9.DECIMAL_DIGITS int => 小数位数。对于 DECIMAL_DIGITS 不适用的数据类型,将返回 Null。
    10.NUM_PREC_RADIX int => 基数(通常为 10 或 2)
    11.NULLABLE int => 允许为 NULL。
    •columnNoNulls - 可能不允许 NULL 值
    •columnNullable - 绝对允许 NULL 值
    •columnNullableUnknown - 可空性未知
    12.REMARKS String => 注释描述列(可能为空)
    13.COLUMN_DEF String => 列的默认值,当值用单引号括起来时应该解释为字符串(可以为null)
    14.SQL_DATA_TYPE int => 未使用
    15.SQL_DATETIME_SUB int => 未使用
    16.CHAR_OCTET_LENGTH int => 对于char类型的列中的最大字节数
    17.ORDINAL_POSITION int => 表中列的索引(从 1 开始)
    18.IS_NULLABLE String => ISO 规则用于确定列的可空性。
    •YES --- 如果列可以包含 NULL
    •NO --- 如果列不能包含 NULL
    •empty string --- 如果列的可空性未知
    19.SCOPE_CATALOG String => 作为引用属性范围的表目录(如果 DATA_TYPE 不是 REF,则为 null)
    20.SCOPE_SCHEMA String => 作为引用属性范围的表模式(如果 DATA_TYPE 不是 REF,则为 null)
    21.SCOPE_TABLE String => 表示此引用属性范围的表名(如果 DATA_TYPE 不是 REF,则为 null)
    22.SOURCE_DATA_TYPE short => 不同类型的源类型或用户生成的 Ref 类型,来自 java.sql.Types 的 SQL 类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为 null)
    23.IS_AUTOINCREMENT String => 表示该列是否自动递增
    •YES --- 如果列是自动递增的
    •NO --- 如果列不是自动递增的
    •empty string --- 如果无法确定列是否自动递增
    24.IS_GENERATEDCOLUMN String => 表示这是否是生成列
    •YES --- 如果这是一个生成的列
    •NO --- 如果这不是生成的列
    •empty string --- 如果无法确定这是否是生成的列
    COLUMN_SIZE 列指定给定列的列大小。对于数值数据,这是最大精度。对于字符数据,这是字符长度。对于日期时间数据类型,这是字符串表示的字符长度(假设小数秒组件的最大允许精度)。对于二进制数据,这是以字节为单位的长度。对于 ROWID 数据类型,这是以字节为单位的长度。对于列大小不适用的数据类型,返回 Null。
    
    参数:
    目录 - 目录名称;必须与存储在数据库中的目录名称匹配;"" 检索那些没有目录的;null 表示不应使用目录名称来缩小搜索范围
    schemaPattern - 模式名称模式;必须与存储在数据库中的模式名称匹配;"" 检索那些没有模式的;null 表示不应使用模式名称来缩小搜索范围
    tableNamePattern - 表名模式;必须与存储在数据库中的表名匹配
    columnNamePattern - 列名模式;必须与存储在数据库中的列名匹配
    回报:
    ResultSet - 每一行都是一个列描述
    抛出:
    SQLException - 如果发生数据库访问错误
    也可以看看:
    getSearchStringEscape()
    
    • 1

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve