sql - 查询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;
解决方案
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>
- 更新 -
DESCRIBE
orDESC
命令没有提供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>
干杯!!
推荐阅读
- nginx - Kubeadm Kubernetes 集群无法使用 ingress 将外部 IP 地址映射到域名
- ansible - 如何从ansible库存文件中跳过主机名?
- javascript - 如何将自动对焦设置为选择下拉列表中的输入?
- django - modelManager get_by_natural 密钥方法更改 USERNAME_FIELD 影响我的身份验证?
- typescript - 我怎样才能做 debounceTime 但第一个值
- r - “文件中的错误(文件,“rt”):在读取 1 个 .csv 文件时,“描述”参数无效”
- azure - Azure DevOps 部署到具有不同 SPN 的同一订阅中的资源组
- angular - 为什么我的 Angular 模板中的数据会出现“未定义”错误?
- excel - 用户窗体问题:组合框不会填充项目
- python-3.x - Python3 有内置的 Http/2 请求库吗?