【问题标题】:Get Specific Column Names in SYNONYM in Oracle在 Oracle 的 SYNONYM 中获取特定的列名
【发布时间】:2017-03-07 10:05:55
【问题描述】:

通过此查询,我可以成功获取 Oracle 表的列名列表。

SELECT COLUMN_NAME
FROM USER_TAB_COLUMNS
WHERE table_name = 'TBL_NEWS' 
AND COLUMN_NAME LIKE ('GLOBE_%') 
ORDER BY  COLUMN_ID

我有一个同义词,我还需要获取该同义词的所有列名。那么如何扩展上述查询以获取以 GLOBE_ 开头的 Synonym 中的所有列名?

【问题讨论】:

    标签: sql oracle synonym


    【解决方案1】:

    同义词没有列,它引用的表有。所以你可以使用这个:

    SELECT COLUMN_NAME
    FROM ALL_TAB_COLUMNS atc
    JOIN ALL_SYNONYMS als ON atc.table_name = als.table_name
    WHERE als.SYNONYM_NAME='my_synonym'
      AND als.OWNER IN (USER, 'PUBLIC')
      AND atc.COLUMN_NAME LIKE ('GLOBE_%')
    ORDER BY atc.COLUMN_ID
    

    【讨论】:

    • 同义词也可以用于其他模式的视图,上面的答案不包括视图,但只考虑表。不是吗?
    • @SrikanthA:实际上,它也适用于视图,因为USER_TAB_COLUMNS 还包含视图的列。
    • 对,其他模式 - 使用 ALL_TAB_COLUMNS 怎么样
    • @SrikanthA:好的,将其更改为 ALL_TAB_COLUMNS。
    • 删除 AND als.OWNER IN (USER, 'PUBLIC')AND atc.COLUMN_NAME LIKE ('GLOBE_%') 看看你有没有得到什么。还要记住,Oracle 中的标识符通常是大写的(除非“引用”),因此同义词名称和列名使用大写。
    【解决方案2】:

    根据您希望从中获取数据的 Schema 范围 - 您可以使用 ALL_TAB_COLUMNS 和 ALL_SYNONYMS 或 DBA_TAB_COLUMNS 和 DBA_SYNONYMS

    SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS ATC JOIN ALL_SYNONYMS ALS ON ATC.table_name = ALS.table_name WHERE ALS.SYNONYM_NAME='my_synonym'      AND ATC.COLUMN_NAME LIKE ('GLOBE_%') ORDER BY ATC.COLUMN_ID;
    
    or 
    
    
    SELECT COLUMN_NAME FROM DBA_TAB_COLUMNS DTC JOIN DBA_SYNONYMS DS ON DTC.table_name = DS.table_name WHERE DS.SYNONYM_NAME='my_synonym'    AND DTC.COLUMN_NAME LIKE ('GLOBE_%') ORDER BY DTC.COLUMN_ID;
    

    【讨论】:

      【解决方案3】:

      而不是查询数据字典。您可以创建函数来返回表/视图/同义词中的列列表。

      create type list_varchar2 is table of varchar2(100);
      /
      create or replace function  list_of_column(p_name in varchar2) return list_varchar2 PIPELINED  
          is
              v_Cnt        number :=  0;
              v_table_description       dbms_sql.desc_tab;
              c_curosor     integer default dbms_sql.open_cursor;
         begin
             dbms_sql.parse(  c_curosor, 'select * from '|| p_name||' where 1 = 2', dbms_sql.native );
             dbms_sql.describe_columns( c       => c_curosor,
                                        col_cnt => v_Cnt,
                                        desc_t  => v_table_description );
      
             for i in 1 .. v_Cnt
             loop
      
                 pipe row ( v_table_description(i).col_name );
      
              end loop;
             dbms_sql.close_cursor(c_curosor);
         exception
             when others then dbms_sql.close_cursor( c_curosor );
                 raise;
         end ;
      /
      select * from table(list_of_column('table_name'))
      /
      select * from table(list_of_column('view_name'))
      /
      select * from table(list_of_column('synonym'))
      /
      

      【讨论】:

        猜你喜欢
        • 2017-02-22
        • 2011-04-16
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-16
        • 2015-07-08
        • 1970-01-01
        相关资源
        最近更新 更多