web-dev-qa-db-fra.com

Rechercher dans une base de données Oracle des tables avec des noms de colonne spécifiques?

Nous avons une grande base de données Oracle avec de nombreuses tables. Existe-t-il un moyen de rechercher ou de rechercher s'il existe des tables avec certains noms de colonne?

IE me montre toutes les tables qui ont les colonnes: id, fname, lname, address

Détail que j’ai oublié d’ajouter: j’ai besoin de pouvoir rechercher dans différents schémas. Celui que je dois utiliser pour me connecter ne possède pas les tables que je dois parcourir.

86
David Oneill

Pour trouver toutes les tables avec une colonne particulière:

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

Pour trouver des tables contenant une ou plusieurs des 4 colonnes:

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

Pour rechercher des tables contenant les 4 colonnes (aucune ne manque):

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

Pour rechercher un nom de colonne, utilisez la requête ci-dessous si vous connaissez le nom de colonne avec précision:

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

POUR rechercher un nom de colonne si vous ne connaissez pas la colonne exacte à utiliser ci-dessous:

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

Les données que vous souhaitez se trouvent dans la table de méta-données "cols":

SELECT * FROM COLS WHERE COLUMN_NAME = 'id'

Celui-ci vous donnera une liste de tables qui ont all des colonnes que vous voulez:

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

Pour ce faire dans un schéma différent, spécifiez simplement le schéma devant la table, comme dans

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

Si vous souhaitez combiner les recherches de plusieurs schémas dans un seul résultat, procédez comme suit:

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

En voici un que nous avons enregistré dans findcol.sql afin que nous puissions l'exécuter facilement à partir de 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
0
Doug Porter