Est-il possible de rechercher dans chaque champ de chaque table une valeur particulière dans Oracle?
Il y a des centaines de tables avec des milliers de lignes dans certaines tables, donc je sais que cela peut prendre beaucoup de temps à interroger. Mais la seule chose que je sais, c'est qu'une valeur pour le champ sur lequel je voudrais interroger est 1/22/2008P09RR8
. <
J'ai essayé d'utiliser cette déclaration ci-dessous pour trouver une colonne appropriée en fonction de ce que je pense qu'elle devrait être nommée, mais elle n'a renvoyé aucun résultat.
SELECT * from dba_objects
WHERE object_name like '%DTN%'
Il n'y a absolument aucune documentation sur cette base de données et je n'ai aucune idée d'où ce champ est extrait.
Des pensées?
Réponses:
Citation:
Une colonne n'est pas un objet. Si vous voulez dire que vous vous attendez à ce que le nom de la colonne ressemble à '% DTN%', la requête souhaitée est:
Mais si la chaîne 'DTN' n'est qu'une supposition de votre part, cela n'aidera probablement pas.
Au fait, dans quelle mesure ê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ù il vient, il peut s'agir d'une concaténation de plusieurs colonnes, ou du résultat d'une fonction, ou d'une valeur située dans un objet table imbriqué. Donc, vous pourriez être sur une chasse à l'oie sauvage en essayant de vérifier chaque colonne pour cette valeur. Ne pouvez-vous pas commencer avec n'importe quelle application cliente affichant 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 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 SQL dynamique. Voici un code écrit à la hâte pour cela:
Il existe également des moyens de le rendre plus efficace.
Dans ce cas, compte tenu de 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 le restreindre aux colonnes où le type est comme '% CHAR%'.
Au lieu d'une requête par colonne, vous pouvez créer une requête par table comme ceci:
la source
all_tab_columns
nonall_tables
. Je l'ai réparé.J'ai apporté quelques modifications au code ci-dessus pour le rendre plus rapide si vous recherchez un seul propriétaire. Il vous suffit de modifier les 3 variables v_owner, v_data_type et v_search_string pour qu'elles correspondent à ce que vous recherchez.
la source
'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" = :1'
dbms_output
? Parce que les requêtes sont exécutées avec succès dans DataGrip, mais je ne vois aucun résultat après.Voici une autre version modifiée qui comparera une correspondance de sous-chaîne inférieure. Cela fonctionne dans Oracle 11g.
la source
Oui, vous pouvez et votre DBA vous détestera et vous trouvera pour clouer vos chaussures au sol car cela entraînera beaucoup d'E / S et réduira vraiment les performances de la base de données à mesure que le cache se purge.
pour un début.
Je commencerais par les requêtes en cours, en utilisant le
v$session
et lev$sqlarea
. Cela change en fonction de la version d'Oracle. Cela réduira l'espace et ne touchera pas tout.la source
Je sais que c'est un vieux sujet. Mais je vois un commentaire à la question demandant si cela pourrait être fait
SQL
plutôt que d'utiliserPL/SQL
. Alors pensé à poster une solution.La démonstration ci-dessous consiste à rechercher une VALEUR dans toutes les COLONNES de toutes les TABLES d'un SCHEMA entier :
Cherchons la valeur
KING
dans leSCOTT
schéma.Cherchons la valeur
20
dans leSCOTT
schéma.la source
Error occurred in XML processing ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
Je ferais quelque chose comme ça (génère toutes les sélections dont vous avez besoin). Vous pouvez plus tard les alimenter vers sqlplus:
Il donne:
Et ce qu'il fait est - pour chacun
table_name
deuser_tables
obtenir chaque champ (de desc) et créer un select * from table où le champ est égal à «val».la source
J'ai modifié le script de Flood pour qu'il s'exécute une fois pour chaque table plutôt que pour chaque colonne de chaque table pour une exécution plus rapide. Il nécessite Oracle 11g ou supérieur.
la source
J'avais les problèmes suivants pour la réponse @Lalit Kumars,
La solution est:
la source
si nous connaissons les noms de table et de colonne mais que nous voulons savoir le nombre de fois que la chaîne apparaît pour chaque schéma:
la source
Procédure de recherche dans toute la base de données:
Exécuter l'instruction
Exemples de résultats
la source
Je n'ai pas de solution simple sur le promprt SQL. Cependant, il existe de nombreux outils comme crapaud et PL / SQL Developer qui ont une interface graphique dans laquelle un utilisateur peut entrer la chaîne à rechercher et il renverra la table / procédure / objet où cela se trouve.
la source
Il existe des outils gratuits qui permettent ce type de recherche, par exemple, celui-ci fonctionne bien et le code source est disponible: https://sites.google.com/site/freejansoft/dbsearch
Vous aurez besoin du pilote ODBC Oracle et d'un DSN pour utiliser cet outil.
la source
Modifier le code pour rechercher sans tenir compte de la casse à l'aide d'une requête LIKE au lieu de trouver des correspondances exactes ...
la source
--it exécution terminée - pas d'erreur
la source
Emprunter, améliorer légèrement et simplifier à partir de cet article de blog, la simple instruction SQL suivante semble très bien faire le travail:
la source
la source