Citation :
J'ai essayé d'utiliser cette déclaration ci-dessous pour trouver une colonne appropriée basée sur ce que je pense qu'elle devrait être nommée mais cela n'a donné aucun résultat.
SELECT * from dba_objects WHERE
object_name like '%DTN%'
Une colonne n'est pas un objet. Si vous voulez dire que vous vous attendez à ce que le nom de la colonne soit comme '%DTN%', la requête que vous voulez est :
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
Mais si la chaîne 'DTN' est juste une supposition de votre part, cela ne vous aidera probablement pas.
Soit dit en passant, à quel point êtes-vous certain que '1/22/2008P09RR8' est une valeur sélectionnée directement à partir d'une seule colonne ? Si vous ne savez pas du tout d'où cela provient, cela pourrait être une concaténation de plusieurs colonnes, ou le résultat d'une fonction, ou une valeur se trouvant dans un objet de table imbriquée. Vous pourriez donc courir après des chimères en essayant de vérifier chaque colonne pour cette valeur. Ne pourriez-vous pas commencer par l'application cliente qui affiche cette valeur et essayer de comprendre quelle requête elle utilise pour l'obtenir ?
Quoi qu'il en soit, la réponse de diciu donne une méthode pour générer des requêtes SQL afin de vérifier chaque colonne de chaque table pour cette valeur. Vous pouvez également faire des choses similaires entièrement dans une session SQL en utilisant un bloc PL/SQL et du SQL dynamique. Voici un code écrit à la hâte pour cela :
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 <> 'SYS' 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.table_name ||' '||t.column_name||' '||match_count );
END IF;
END LOOP;
END;
/
Il existe des moyens de rendre cela plus efficace également.
Dans ce cas, étant donné la valeur que vous recherchez, vous pouvez clairement éliminer toute colonne de type NUMBER ou DATE, ce qui réduirait le nombre de requêtes. Peut-être même de restreindre aux colonnes où le type est du type '%CHAR%'.
Au lieu d'une requête par colonne, vous pourriez construire une requête par table comme ceci :
SELECT * FROM table1
WHERE column1 = 'valeur'
OR column2 = 'valeur'
OR column3 = 'valeur'
...
;
0 votes
Est-il possible de faire cela en utilisant une seule requête au lieu d'utiliser une procédure stockée?
0 votes
Oui, il est possible de le faire en pur SQL. Voir SQL pour rechercher une VALEUR dans toutes les COLONNES de toutes les TABLES dans un SCHÉMA entier
0 votes
@LalitKumarB La page que vous avez répertoriée n'est plus accessible. Serait-il possible de poster quelques informations en réponse?
0 votes
@DodziDzakuma La page est accessible lalitkumarb.wordpress.com/2015/01/06/… J'ai également posté une réponse, veuillez faire défiler vers le bas ou voir stackoverflow.com/a/27794127/3989608
0 votes
Si vous avez du mal à comprendre la requête de Lalit Kumar, essayez cette démo: sqlfiddle.com/#!4/76924c/2/0
0 votes
Oui, je sais que c'est 12 ans plus tard. Toad dispose d'une fonction de recherche pour cela.