Citation :
J'ai essayé d'utiliser l'instruction ci-dessous pour trouver une colonne appropriée en fonction de ce que je pense qu'elle devrait être nommée mais cela 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 du type '%DTN%', la requête que vous voulez est la suivante :
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
Mais si la chaîne "DTN" n'est qu'une supposition de votre part, cela ne servira probablement à rien.
À propos, êtes-vous certain que "1/22/2008P09RR8" est une valeur sélectionnée directement dans une seule colonne ? Si vous ne savez pas du tout d'où elle provient, il peut s'agir d'une concaténation de plusieurs colonnes, du résultat d'une fonction ou d'une valeur située dans un objet de table imbriqué. Vous risquez donc de vous lancer dans une course folle en essayant de vérifier cette valeur dans chaque colonne. Ne pouvez-vous pas commencer par l'application client qui affiche cette valeur et essayer de déterminer la requête qu'elle utilise pour l'obtenir ?
Quoi qu'il en soit, la réponse de diciu donne une méthode de génération de requêtes SQL pour vérifier la valeur de chaque colonne de chaque table. 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 également des moyens de la rendre plus efficace.
Dans ce cas, étant donné la valeur que vous recherchez, vous pouvez clairement éliminer toute colonne de type NUMERO ou DATE, ce qui réduirait le nombre de requêtes. Vous pouvez même vous limiter aux colonnes dont le type est '%CHAR%'.
Au lieu d'une requête par colonne, vous pourriez construire une requête par table comme ceci :
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;
0 votes
Peut-on 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 SQL pur. Voir SQL pour rechercher une VALEUR dans toutes les COLONNES de tous les TABLEAUX d'un SCHEMA entier
0 votes
@LalitKumarB La page que vous avez indiquée n'est plus accessible. Serait-il possible de poster quelques informations en guise de réponse ?
0 votes
@DodziDzakuma La page est accessible lalitkumarb.wordpress.com/2015/01/06/ J'ai également posté une réponse, s'il vous plaît 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, c'est 12 ans plus tard. Toad a une fonction de recherche pour ça.