2016-06-23 2 views
-1

오라클의 쿼리에서 값을 전달하여 테이블에서 열 이름을 가져 오려고합니다. 대부분의 경우 - 우리는 그와 같은 쿼리를 작성합니다 - select * from table where column = 'value'.하지만 제 경우에는 열 이름을 모르겠습니다.오라클에 값을 전달하여 테이블에서 열 이름을 가져옵니다.

나를 제안 할 수 있습니까? 사전에 감사합니다 ...

+0

선택 : 당신이 테이블로 검색을 제한하려면 전체 또는 DBA 테이블을 사용하기로 결정하면, 당신은 USER_TAB_COLUMNS (ALL_TAB_COLUMNS, DBA_TAB_COLUMNS)에 USER_TABLES (ALL_TABLES, DBA_TABLES) TABLE_NAME에 의해, 또는 TABLE_NAMEOWNER에 가입하실 수 있습니다 * from user_tables –

+0

user_tables에서 table_name을 (를) 선택하십시오. 여기서 table_name = 'school_master'; –

+0

'Maria'와 같은 값을 갖고 있으며 Oracle 데이터베이스에서 열 이름과 테이블 이름을 검색하려고합니다. – MakDeveloper

답변

-1
select table_name from user_Tables where table_name = 'bogus'; 
+0

'Maria'와 같은 가치가 있고 오라클 데이터베이스에서 열 이름과 테이블 이름을 검색하고 싶습니다. – MakDeveloper

0

당신은 DB의 모든 테이블을 확인하는 동적 쿼리를 작성하려고 할 수 있습니다.

설정 :

create table tab1 (v1 varchar2(100), n1 number, v1b varchar2(100)); 
create table tab2 (v2 varchar2(100), n2 number, v2b varchar2(100)); 
create table tab3 (v3 varchar2(100), n3 number, v3b varchar2(100)); 
insert into tab1 values ('Maria', 1, 'aa'); 
insert into tab1 values ('xx', 2, 'bb'); 
insert into tab2 values ('yy', 3, 'Maria'); 
insert into tab2 values ('zz', 3, 'cc'); 
insert into tab3 values ('WW', 4, 'DD'); 

동적 쿼리 작성 :

select 'select table_name, 
       matches from (' || listagg(statement, ' UNION ALL ') within group (order by table_name) || ') 
     where matches > 0' 
from (  
    select 'select ''' || table_name || 
      ''' as TABLE_NAME, count(1) as MATCHES from ' || table_name || ' WHERE ' || 
      listagg(column_name || ' = ''Maria''', ' OR ') within group (order by column_name) as statement, 
      table_name 
     from user_tab_columns col 
     where data_type = 'VARCHAR2' 
     group by table_name 
    ) 

이것은 모든 테이블을 확인하기 위해 실행할 수있는 쿼리를 반환됩니다; 줄 것이다

SELECT table_name, matches 
    FROM (SELECT 'TAB1' AS TABLE_NAME, COUNT(1) AS MATCHES 
      FROM TAB1 
     WHERE V1 = 'Maria' 
       OR V1B = 'Maria' 
     UNION ALL 
     SELECT 'TAB2' AS TABLE_NAME, COUNT(1) AS MATCHES 
      FROM TAB2 
     WHERE V2 = 'Maria' 
       OR V2B = 'Maria' 
     UNION ALL 
     SELECT 'TAB3' AS TABLE_NAME, COUNT(1) AS MATCHES 
      FROM TAB3 
     WHERE V3 = 'Maria' 
       OR V3B = 'Maria') 
WHERE matches > 0; 

이 쿼리를 실행 : 내 예를 들어,이 쿼리 (포맷되지 않음)를 구축 할 것입니다

TABL MATCHES 
---- ---------- 
TAB1   1 
TAB2   1 

내가 USER_TAB_COLUMNS을 사용하는 것을 알 제발, 따라서 로그인의 테이블에서만 검색 개요; 다른 스키마에서 검색하려면 사용자의 권한과 사용자의 권한에 따라 ALL_TAB_COLUMNS 또는 DBA_TAB_COLUMNS을 사용할 수 있습니다. 더 많은 것을 위해 here을보십시오.

또한 USER_TAB_COLUMNS은 테이블과 뷰의 열을 가져옵니다.

SQL> create view vTab1 as select * from tab1; 

View created. 

SQL> select count(1) 
    2 from user_tab_columns 
    3 where table_name = 'VTAB1'; 

    COUNT(1) 
---------- 
     3 

SQL> select count(1) 
    2 from user_tab_columns 
    3  inner join user_tables using(table_name) 
    4 where table_name = 'VTAB1'; 

    COUNT(1) 
---------- 
     0 

SQL> 
관련 문제