2009-12-23 11 views
77

Abbiamo un grande database Oracle con molte tabelle. C'è un modo per interrogare o cercare per trovare se ci sono tabelle con determinati nomi di colonne?Cerca un database Oracle per le tabelle con nomi di colonne specifici?

IE mi mostra tutte le tabelle che hanno le colonne: id, fname, lname, address

Particolare Ho dimenticato di aggiungere: ho bisogno di essere in grado di cercare attraverso diversi schemi. Quello che devo usare per la connessione non possiede le tabelle che devo cercare.

risposta

151

Per trovare tutte le tabelle con una colonna particolare:

select owner, table_name from all_tab_columns where column_name = 'ID'; 

Per trovare le tabelle che avere una o tutte le 4 colonne:

select owner, table_name, column_name 
from all_tab_columns 
where column_name in ('ID', 'FNAME', 'LNAME', 'ADDRESS'); 

per trovare tabelle che hanno tutte le 4 colonne (con nessuno mancante):

select owner, table_name 
from all_tab_columns 
where column_name in ('ID', 'FNAME', 'LNAME', 'ADDRESS') 
group by owner, table_name 
having count(*) = 4; 
+0

Grazie, l'ha fatto! –

+1

Probabilmente dovresti usare DBA_TAB_COLUMNS invece di ALL_TAB_COLUMNS per fare questa ricerca, nel caso in cui l'utente che stai effettuando l'accesso non abbia accesso ad alcune tabelle. –

+0

Vero, ma solo se l'utente che si è connessi ha il privilegio SELECT ANY TABLE. –

9

I dati che si desidera è in "cols" tabella dei meta-dati:

SELECT * FROM COLS WHERE COLUMN_NAME = 'id' 

Questo vi darà un elenco di tabelle che hanno tutte le colonne che si desidera:

select distinct 
    C1.TABLE_NAME 
from 
    cols c1 
    inner join 
    cols c2 
    on C1.TABLE_NAME = C2.TABLE_NAME 
    inner join 
    cols c3 
    on C2.TABLE_NAME = C3.TABLE_NAME 
    inner join 
    cols c4 
    on C3.TABLE_NAME = C4.TABLE_NAME 
    inner join 
    tab t 
    on T.TNAME = C1.TABLE_NAME 
where T.TABTYPE = 'TABLE' --could be 'VIEW' if you wanted 
    and upper(C1.COLUMN_NAME) like upper('%id%') 
    and upper(C2.COLUMN_NAME) like upper('%fname%') 
    and upper(C3.COLUMN_NAME) like upper('%lname%') 
    and upper(C4.COLUMN_NAME) like upper('%address%') 

Per fare questo in uno schema diverso, basta specificare lo schema di fronte al tavolo, come in

SELECT * FROM SCHEMA1.COLS WHERE COLUMN_NAME LIKE '%ID%'; 

Se si desidera combinare le ricerche di molti schemi in un unico risultato in uscita, allora si potrebbe fare questo:

SELECT DISTINCT 
    'SCHEMA1' AS SCHEMA_NAME 
,TABLE_NAME 
FROM SCHEMA1.COLS 
WHERE COLUMN_NAME LIKE '%ID%' 
UNION 
SELECT DISTINCT 
    'SCHEMA2' AS SCHEMA_NAME 
,TABLE_NAME 
FROM SCHEMA2.COLS 
WHERE COLUMN_NAME LIKE '%ID%' 
+0

Come si usa questo per osservare uno schema diverso? (Ho dimenticato di menzionare tale req nella mia domanda originale) –

+0

Basta anteporre il nome dello schema alla parte anteriore di ogni nome di tabella ... i.e. myschema.c1. Ovviamente è necessario avere privilegi di selezione sull'altro schema – wadesworld

+0

'SELECT * FROM COLS' non restituisce nulla dal mio schema. Ho solo privilegi di selezione sui tavoli. Selezionerebbe non essere sufficiente per permettermi di visualizzarlo tramite COLS? –

0

Ecco quello che abbiamo salvato fuori per findcol.sql in modo che possiamo eseguire facilmente dall'interno SQLPlus

set verify off 
clear break 
accept colnam prompt 'Enter Column Name (or part of): ' 
set wrap off 
select distinct table_name, 
       column_name, 
       data_type || ' (' || 
       decode(data_type,'LONG',null,'LONG RAW',null, 
         'BLOB',null,'CLOB',null,'NUMBER', 
         decode(data_precision,null,to_char(data_length), 
           data_precision||','||data_scale 
          ), data_length 
        ) || ')' data_type 
    from all_tab_columns 
where column_name like ('%' || upper('&colnam') || '%'); 
set verify on 
8

per cercare un nome di colonna utilizzare la query di seguito se si conosce il nome della colonna con precisione :

select owner,table_name from all_tab_columns where upper(column_name) =upper('keyword'); 

per cercare un nome di colonna se non conoscere l'uso della colonna accurata di seguito:

select owner,table_name from all_tab_columns where upper(column_name) like upper('%keyword%'); 
+0

Il trucco 'upper' è grt. – arun

1

select table_name da dba_tab_columns dove column_name = 'THE_COLUMN_YOU_LOOK_FOR';

Problemi correlati