如何使用低权限的PL-SQL在Oracle中获取列数据类型?

Jam*_*mes 55 oracle privileges ddl plsql

我对Oracle数据库中的几个表具有"只读"访问权限.我需要获取一些列的架构信息.我想使用类似于MS SQL的东西sp_help.

我在这个查询中看到了我感兴趣的表:

SELECT * FROM ALL_TABLES
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,Oracle告诉我"在架构中找不到表",是的,参数是正确的.

SELECT 
DBMS_METADATA.GET_DDL('TABLE', 'ITEM_COMMIT_AGG', 'INTAMPS') AS DDL
FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

在使用我的Oracle通用翻译器9000后,我推测这不起作用,因为我没有足够的权限.鉴于我的约束,我如何获得表上的列的数据类型和数据长度?我有PL-SQL语句的读访问权限?

Ada*_*sch 53

ALL_TAB_COLUMNS应该可以从PL/SQL查询. DESC是一个SQL*Plus命令.

SQL> desc all_tab_columns;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(30)
 TABLE_NAME                                NOT NULL VARCHAR2(30)
 COLUMN_NAME                               NOT NULL VARCHAR2(30)
 DATA_TYPE                                          VARCHAR2(106)
 DATA_TYPE_MOD                                      VARCHAR2(3)
 DATA_TYPE_OWNER                                    VARCHAR2(30)
 DATA_LENGTH                               NOT NULL NUMBER
 DATA_PRECISION                                     NUMBER
 DATA_SCALE                                         NUMBER
 NULLABLE                                           VARCHAR2(1)
 COLUMN_ID                                          NUMBER
 DEFAULT_LENGTH                                     NUMBER
 DATA_DEFAULT                                       LONG
 NUM_DISTINCT                                       NUMBER
 LOW_VALUE                                          RAW(32)
 HIGH_VALUE                                         RAW(32)
 DENSITY                                            NUMBER
 NUM_NULLS                                          NUMBER
 NUM_BUCKETS                                        NUMBER
 LAST_ANALYZED                                      DATE
 SAMPLE_SIZE                                        NUMBER
 CHARACTER_SET_NAME                                 VARCHAR2(44)
 CHAR_COL_DECL_LENGTH                               NUMBER
 GLOBAL_STATS                                       VARCHAR2(3)
 USER_STATS                                         VARCHAR2(3)
 AVG_COL_LEN                                        NUMBER
 CHAR_LENGTH                                        NUMBER
 CHAR_USED                                          VARCHAR2(1)
 V80_FMT_IMAGE                                      VARCHAR2(3)
 DATA_UPGRADED                                      VARCHAR2(3)
 HISTOGRAM                                          VARCHAR2(15)
Run Code Online (Sandbox Code Playgroud)

  • 一个例子很好. (6认同)
  • @leanne您可以像这样使用此表:`SELECT*FROM user_tab_columns WHERE table_name ='FILL_IN_THE_TABLE_NAME'AND column_name ='FILL_IN_THE_COLUMN_NAME';` (3认同)

akf*_*akf 36

您可以使用该desc命令.

desc MY_TABLE
Run Code Online (Sandbox Code Playgroud)

这将为您提供列名,null是否有效以及数据类型(和长度,如果适用)


小智 17

注意:如果您尝试获取不同SCHEMA中的表的此信息,请使用all_tab_columns视图,我们遇到此问题,因为我们的应用程序出于安全目的使用不同的SCHEMA.

使用以下内容:

例如:

SELECT
    data_length 
FROM
    all_tab_columns 
WHERE
    upper(table_name) = 'MY_TABLE_NAME' AND upper(column_name) = 'MY_COL_NAME'
Run Code Online (Sandbox Code Playgroud)


sev*_*ryn 17

我发现这种情况的最佳解决方案是

select column_name, data_type||
case
when data_precision is not null and nvl(data_scale,0)>0 then '('||data_precision||','||data_scale||')'
when data_precision is not null and nvl(data_scale,0)=0 then '('||data_precision||')'
when data_precision is null and data_scale is not null then '(*,'||data_scale||')'
when char_length>0 then '('||char_length|| case char_used 
                                                         when 'B' then ' Byte'
                                                         when 'C' then ' Char'
                                                         else null 
                                           end||')'
end||decode(nullable, 'N', ' NOT NULL')
from user_tab_columns
where table_name = 'TABLE_NAME'
and column_name = 'COLUMN_NAME';
Run Code Online (Sandbox Code Playgroud)

@Aaron Stainback,谢谢你的纠正!


小智 12

select t.data_type 
  from user_tab_columns t 
 where t.TABLE_NAME = 'xxx' 
   and t.COLUMN_NAME='aaa'
Run Code Online (Sandbox Code Playgroud)


Eri*_*ski 9

Oracle:获取表中完整数据类型的列表:

select data_type || '(' || data_length || ')' 
from user_tab_columns where TABLE_NAME = 'YourTableName'
Run Code Online (Sandbox Code Playgroud)


mat*_*tti 5

select column_name, data_type || '(' || data_length || ')' as datatype
from all_tab_columns 
where TABLE_NAME = upper('myTableName')
Run Code Online (Sandbox Code Playgroud)