0

我一直在使用 dbVisualizer 作为快速而简单的数据库查看器,因为我不熟悉 Oracle 并且没有可用的 sqlplus/gqlplus。我假设它的“列”视图向我显示了与 Oracle 相同的表元数据。该视图中的标题是:

BUFFER_LENGTH      DECIMAL_DIGITS    SQL_DATA_TYPE
CHAR_OCTET_LENGTH  IS_NULLABLE       SQL_DATETIME_SUB
COLUMN_DEF         NULLABLE          TABLE_CAT
COLUMN_NAME        NUM_PREC_RADIX    TABLE_NAME
COLUMN_SIZE        ORDINAL_POSITION  TABLE_SCHEM
DATA_TYPE          REMARKS           TYPE_NAME

我的应用程序非常简单,但它确实有几个整数字段和几个小数字段,我希望能够在开发过程中轻松转储这些信息。

所以我通过 Python 的 cx_Oracle 查询了 USER_TAB_COLS 表,并询问了 DECIMAL_DIGITS 等。我得到“cx_Oracle.DatabaseError:ORA-00904:“DECIMAL_DIGITS”:无效标识符”。我要求的其他列都很好。

于是我直接通过cx_Oracle查询了USER_TAB_COLS,得到了这些字段:

AVG_COL_LEN           DATA_TYPE_MOD       NULLABLE
CHAR_COL_DECL_LENGTH  DATA_TYPE_OWNER     NUM_BUCKETS
CHAR_LENGTH           DATA_UPGRADED       NUM_DISTINCT
CHAR_USED             DEFAULT_LENGTH      NUM_NULLS
CHARACTER_SET_NAME    DENSITY             QUALIFIED_COL_NAME
COLUMN_ID             GLOBAL_STATS        SAMPLE_SIZE
COLUMN_NAME           HIDDEN_COLUMN       SEGMENT_COLUMN_ID
DATA_DEFAULT          HIGH_VALUE          TABLE_NAME
DATA_LENGTH           HISTOGRAM           USER_STATS
DATA_PRECISION        INTERNAL_COLUMN_ID  V80_FMT_IMAGE
DATA_SCALE            LAST_ANALYZED       VIRTUAL_COLUMN
DATA_TYPE             LOW_VALUE

碰巧我感兴趣的其他字段(表名、列名、数据类型和字符长度)在两个列表中具有相同的名称。但不是 DECIMAL_DIGITS。

所以,如果这就是 cx_Oracle 给我的,那很好;我会用它来运行,因为这就是我想用来转储我的模式(用于下游进一步处理)的东西。但我不知道如何从更大的字段列表中获取相同的信息。对于我的所有字段,DATA_PRECISION 为“无”,无论它们在创建表时被声明为 INT 还是 NUMBER(*, 4)。同样,我所有的数字字段的 DATA_LENGTH 都是 22。

我来自哪里:我在使用 Postgres 和 ColdFusion 和 Zope 等专用中间件系统进行 Web/数据库开发方面有着陈旧而生疏的背景,但我是 Oracle 的新手。感谢您愿意提供的任何和所有帮助!

4

1 回答 1

0

啊哈!我想我明白了——它是 DATA_SCALE。我混淆了 DATA_SCALE 和 DATA_PRECISION,这两个参数可以在 Oracle 中提供给 NUMBER 字段。不知何故,在我看来,精度应该是小数点后的部分,而比例应该是总位数,但实际上恰恰相反。

我将把这个问题留一点,因为有人可能希望比我在这里更好地解释它;而且我仍然希望有人会知道为什么查看架构的不同方式会为我提供如此不同的信息。

于 2014-08-20T21:08:58.733 回答