Cerca un database Oracle per le tabelle con nomi di colonne specifici?

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?

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

Dettaglio Ho dimenticato di aggiungere: Devo essere in grado di cercare tra diversi schemi. Quello che devo usare per la connessione non possiede le tabelle che devo cercare.

Per trovare tutte le tabelle con una particolare colonna:

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

Per trovare le tabelle che contengono 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 e 4 le colonne (senza nessuna 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; 

I dati che desideri sono nella tabella dei meta-dati “cols”:

 SELECT * FROM COLS WHERE COLUMN_NAME = 'id' 

Questo ti darà una lista di tabelle che hanno tutte le colonne che vuoi:

 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 ciò in uno schema diverso, basta specificare lo schema davanti alla tabella, come in

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

Se vuoi combinare le ricerche di molti schemi in un risultato di output, puoi farlo:

 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%' 

Per cercare un nome di colonna utilizzare la query seguente se si conosce il nome della colonna in modo accurato:

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

Per cercare un nome di colonna se non si conosce la colonna precisa, utilizzare di seguito:

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

Eccone uno che abbiamo salvato per findcol.sql in modo che possiamo eseguirlo facilmente da 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