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