Получить определенные имена столбцов в SYNONYM в Oracle

С помощью этого запроса я могу успешно получить список имен столбцов для таблицы Oracle.

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

У меня есть синоним, и мне также нужно получить все имена столбцов этого синонима. Итак, как я могу расширить приведенный выше запрос, чтобы получить все имена столбцов в синониме, начиная с GLOBE_?


person TechGuy    schedule 07.03.2017    source источник


Ответы (3)


Синоним не имеет столбцов, в отличие от таблицы, на которую он ссылается. Итак, вы можете использовать это:

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
person Erich Kitzmueller    schedule 07.03.2017
comment
Синоним может быть для представления и из другой схемы, ответ выше исключает представления, но рассматривает только таблицы. не так ли? - person Srikanth A; 07.03.2017
comment
@SrikanthA: На самом деле, это работает и для представлений, поскольку USER_TAB_COLUMNS также содержит столбцы представлений. - person Erich Kitzmueller; 07.03.2017
comment
Да, и другие схемы. Как насчет использования ALL_TAB_COLUMNS - person Srikanth A; 07.03.2017
comment
@SrikanthA: Хорошо, изменил это на ALL_TAB_COLUMNS. - person Erich Kitzmueller; 07.03.2017
comment
удалите AND als.OWNER IN (USER, 'PUBLIC') и AND atc.COLUMN_NAME LIKE ('GLOBE_%') и посмотрите, получится ли что-нибудь. Также имейте в виду, что идентификаторы в Oracle обычно пишутся в верхнем регистре (если они не заключены в кавычки), поэтому используйте верхний регистр для имени синонима и имени столбца. - person Erich Kitzmueller; 07.03.2017
comment
К сожалению, в Oracle вы можете создавать синонимы для других синонимов, и я не думаю, что этот ответ справится. Имя столбца ALL_SYNONYMS.TABLE_NAME вводит в заблуждение: если синоним не указывает на таблицу, он фактически не содержит имя таблицы. Итак, я думаю, что полное решение вопроса ОП должно быть немного более общим. - person Matthew McPeak; 07.03.2017
comment
... исправьте псевдоним в первом соединении с utc на atc - person jimo3; 05.07.2017

В зависимости от объема схемы, из которой вы хотите получить данные, вы можете использовать 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;
person Srikanth A    schedule 07.03.2017

Вместо запроса словаря данных. Вы можете создать функцию для возврата списка столбцов в таблице/представлении/синониме.

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'))
/
person Arkadiusz Łukasiewicz    schedule 07.03.2017