首页 > 解决方案 > 查询Oracle数据字典的程序

问题描述

为了准备面试,我正在解决一些 Oracle 练习题。我应该编写一个脚本,提供所有信息,并复制 Oracle 的 SQL*Plus describe 命令的格式,并且输出应在行上添加注释。

输入:所有者和表名。
输出:Name、Null?、Type、Comments 的列。

这个问题让我非常困惑。我可以有效地查询数据字典,但我真的不知道我真正期望做什么。

我能够想出这个,但我留下了评论部分。

select column_name AS "Name",
       (case when nullable = 'N'
             then 'NOT NULL'
             else null
         end) AS "Null?",
       (case when data_type = 'DATE'
             then data_type
             when data_type = 'NUMBER' and data_scale > 0
             then data_type || '(' || data_precision || ',' || data_scale || ')'
             when data_type = 'NUMBER' and data_scale = 0
             then data_type || '(' || data_precision || ')'
             when data_type = 'VARCHAR2'
             then data_type || '(' || data_length || ')'
        end) AS "Type"
  from user_tab_columns
 where table_name = UPPER('&table_name')
 order by column_id;

标签: sqloraclesqlplus

解决方案


USER_TAB_COLUMNS您可以使用单选使用字典视图来实现它。如果您希望它PL/SQL script为它创建,则在 中使用此查询for loop并使用DBMS_OUTPUT所需的格式将其显示到输出中,如下所示:

SQL> DESC EMPLOYEES;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER
 FIRSTNAME                                          VARCHAR2(100)
 CITY                                               VARCHAR2(100)

SQL> column "Name" format a41
SQL> column "Null?" format a8
SQL> column "Type" format a28
SQL> SELECT
  2      COLUMN_NAME   AS "Name",
  3      DECODE(NULLABLE,'N','NOT NULL')      AS "Null?",
  4      DATA_TYPE
  5      || '('
  6      || DATA_LENGTH
  7      || ')' AS "Type"
  8  FROM
  9      USER_TAB_COLUMNS
 10  WHERE
 11      TABLE_NAME = 'EMPLOYEES';

Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
ID                                        NOT NULL NUMBER(22)
FIRSTNAME                                          VARCHAR2(100)
CITY                                               VARCHAR2(100)

SQL>

- 更新 -

DESCRIBEorDESC命令没有提供oracle 文档comment column中提到的,也根据下面的演示。

表、视图、类型和同义词的描述包含以下信息:

每列的名称

每列是否允许空值(NULL 或 NOT NULL)

列的数据类型,例如 CHAR、DATE、LONG、LONGRAW、NUMBER、RAW、ROWID、VARCHAR2 (VARCHAR) 或 XMLType

列的精度(以及数字列的比例,如果有的话)

SQL> comment on column EMPLOYEES.ID is 'unique id';

Comment created.

SQL> DESC EMPLOYEES;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER
 FIRSTNAME                                          VARCHAR2(100)
 CITY                                               VARCHAR2(100)

SQL> DESCRIBE EMPLOYEES;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER
 FIRSTNAME                                          VARCHAR2(100)
 CITY                                               VARCHAR2(100)

SQL>

如果您真的想要comment作为结果的一部分,请使用以下查询:

SQL> SELECT
  2      UT.COLUMN_NAME   AS "Name",
  3      DECODE(UT.NULLABLE, 'N', 'NOT NULL') AS "Null?",
  4      UT.DATA_TYPE
  5      || '('
  6      || UT.DATA_LENGTH
  7      || ')' AS "Type",
  8      UC.COMMENTS
  9  FROM
 10      USER_TAB_COLUMNS UT
 11      JOIN USER_COL_COMMENTS UC ON ( UT.TABLE_NAME = UC.TABLE_NAME
 12                                     AND UT.COLUMN_NAME = UC.COLUMN_NAME )
 13  WHERE
 14      UT.TABLE_NAME = 'EMPLOYEES';

Name                      Null?    Type                 COMMENTS
------------------------- -------- -------------------- --------------------
ID                        NOT NULL NUMBER(22)           unique id
FIRSTNAME                          VARCHAR2(100)
CITY                               VARCHAR2(100)

SQL>

干杯!!


推荐阅读