首页 文章

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

提问于
浏览
52

我有"read only"访问Oracle数据库中的几个表 . 我需要获取一些列的架构信息 . 我'd like to use something analogous to MS SQL' s sp_help .

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

SELECT * FROM ALL_TABLES

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

SELECT 
DBMS_METADATA.GET_DDL('TABLE', 'ITEM_COMMIT_AGG', 'INTAMPS') AS DDL
FROM DUAL;

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

8 回答

  • 30
    select column_name, data_type || '(' || data_length || ')' as datatype
    from all_tab_columns 
    where TABLE_NAME = upper('myTableName')
    
  • 13

    快速而肮脏的方式(例如,查看数据如何存储在oracle中)

    SQL> select dump(dummy) dump_dummy, dummy
         , dump(10) dump_ten
    from dual
    
    DUMP_DUMMY       DUMMY DUMP_TEN            
    ---------------- ----- --------------------
    Typ=1 Len=1: 88  X     Typ=2 Len=2: 193,11 
    1 row selected.
    

    将显示表sys.dual中的虚拟列具有typ = 1(varchar2),而10是Typ = 2(数字) .

  • 15

    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)
    
  • 47

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

    使用以下内容:

    例如:

    SELECT
        data_length 
    FROM
        all_tab_columns 
    WHERE
        upper(table_name) = 'MY_TABLE_NAME' AND upper(column_name) = 'MY_COL_NAME'
    
  • 10

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

    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';
    

    @Aaron Stainback,谢谢你的纠正!

  • 7

    Oracle: Get a list of the full datatype in your table:

    select data_type || '(' || data_length || ')' 
    from user_tab_columns where TABLE_NAME = 'YourTableName'
    
  • 2

    您可以使用 desc 命令 .

    desc MY_TABLE
    

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

  • 4
    select t.data_type 
      from user_tab_columns t 
     where t.TABLE_NAME = 'xxx' 
       and t.COLUMN_NAME='aaa'
    

相关问题