Trouver une valeur spécifique dans chaque colonne de chaque table Oracle
Ce guide explique comment rechercher une valeur spécifique ("22/01/2008P09RR8") dans chaque champ de chaque table d'une grande base de données Oracle. Le défi réside dans le nom de colonne inconnu et dans le volume considérable de données.
La première tentative d'utilisation de SELECT * from dba_objects WHERE object_name like '%DTN%'
s'est avérée infructueuse. Voici des stratégies efficaces :
Affinage de la recherche par nom de colonne :
Améliorez la recherche de nom de colonne avec :
<code class="language-sql">SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';</code>
Cela se concentre sur les colonnes contenant « DTN », identifiant potentiellement la colonne cible.
Recherche complète de tables et de colonnes (approche PL/SQL) :
Cette méthode robuste utilise un bloc PL/SQL et du SQL dynamique pour rechercher chaque colonne :
<code class="language-sql">SET SERVEROUTPUT ON SIZE 100000 DECLARE match_count INTEGER; BEGIN FOR t IN (SELECT owner, table_name, column_name FROM all_tab_columns WHERE owner NOT IN ('SYS', 'SYSTEM') AND data_type LIKE '%CHAR%') LOOP EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name || ' WHERE '||t.column_name||' = :1' INTO match_count USING '1/22/2008P09RR8'; IF match_count > 0 THEN dbms_output.put_line( t.owner || '.' || t.table_name || '.' || t.column_name || ': ' || match_count ); END IF; END LOOP; END; /</code>
Remarque : la clause WHERE owner NOT IN ('SYS', 'SYSTEM')
est ajoutée pour des raisons d'efficacité, à l'exclusion des tables système.
Optimisation de la recherche :
L'efficacité est cruciale. Restreindre la recherche aux types de données de type CHAR
(car la valeur cible est une chaîne) réduit considérablement le temps de traitement.
Alternative : Requêtes consolidées par table :
Au lieu de requêtes de colonnes individuelles, créez une seule requête par table :
<code class="language-sql">SELECT * FROM table1 WHERE column1 = '1/22/2008P09RR8' OR column2 = '1/22/2008P09RR8' OR column3 = '1/22/2008P09RR8' ...;</code>
Cette approche nécessite de connaître au préalable la structure de la table.
Ces méthodes fournissent des solutions efficaces pour localiser une valeur spécifique dans toutes les tables et colonnes d'une base de données Oracle, même avec un nom de colonne initialement inconnu. N'oubliez pas d'ajuster la clause LIKE
dans la requête all_tab_columns
pour refléter toute connaissance supplémentaire sur le nom de la colonne.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!