2017-03-07 45 views
1

使用此查詢,我可以成功獲取Oracle表的列名列表。在Oracle中的SYNONYM中獲取特定列名

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

我有一個同義詞,我需要得到該同義詞的所有列名稱也。那麼,如何擴展上面的查詢以獲得所有在同義詞中的列名從GLOBE_開始?

回答

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 
+0

同義詞可以用於一個視圖以及從其他架構,以上答案排除視圖,但只是考慮表。不是嗎? –

+0

@SrikanthA:實際上,它也適用於視圖,因爲'USER_TAB_COLUMNS'還包含視圖的列。 –

+0

權利,而其他模式 - 如何使用ALL_TAB_COLUMNS –

1

取決於你想從數據架構的範圍 - u可以使用ALL_TAB_COLUMNS和ALL_SYNONYMS OR 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; 
0

而不是查詢數據字典。您可以創建函數來返回表/視圖/同義詞中列的列表。

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')) 
/