Czy w Oracle można przeszukać każde pole każdej tabeli pod kątem określonej wartości?
W niektórych tabelach są setki tabel z tysiącami wierszy, więc wiem, że zapytanie może zająć bardzo dużo czasu. Ale jedyne, co wiem, to to, że wartość pola, o które chcę zapytać, to 1/22/2008P09RR8
. <
Próbowałem użyć poniższego oświadczenia, aby znaleźć odpowiednią kolumnę na podstawie tego, jak myślę, że powinna zostać nazwana, ale nie zwróciła ona żadnych wyników.
SELECT * from dba_objects
WHERE object_name like '%DTN%'
Nie ma absolutnie żadnej dokumentacji w tej bazie danych i nie mam pojęcia, skąd to pole jest pobierane.
jakieś pomysły?
Odpowiedzi:
Zacytować:
Kolumna nie jest obiektem. Jeśli masz na myśli, że spodziewasz się, że nazwa kolumny będzie wyglądać jak „% DTN%”, żądane zapytanie to:
Ale jeśli ciąg „DTN” jest tylko domysłem z Twojej strony, prawdopodobnie to nie pomoże.
Swoją drogą, na ile masz pewność, że „1/22 / 2008P09RR8” jest wartością wybraną bezpośrednio z jednej kolumny? Jeśli w ogóle nie wiesz, skąd pochodzi, może to być konkatenacja kilku kolumn, wynik jakiejś funkcji lub wartość znajdująca się w zagnieżdżonym obiekcie tabeli. Więc możesz być w pogoni za dziką gęsią, próbując sprawdzić każdą kolumnę pod kątem tej wartości. Czy nie możesz zacząć od dowolnej aplikacji klienckiej wyświetlającej tę wartość i spróbować dowiedzieć się, jakiego zapytania używa, aby ją uzyskać?
W każdym razie odpowiedź diciu podaje jedną metodę generowania zapytań SQL w celu sprawdzenia wartości w każdej kolumnie każdej tabeli. Możesz również wykonać podobne czynności całkowicie w jednej sesji SQL, używając bloku PL / SQL i dynamicznego SQL. Oto pośpiesznie napisany kod:
Jest kilka sposobów na zwiększenie wydajności.
W takim przypadku, biorąc pod uwagę szukaną wartość, można wyraźnie wyeliminować każdą kolumnę typu LICZBA lub DATA, co zmniejszyłoby liczbę zapytań. Może nawet ogranicz to do kolumn, w których typ jest taki jak „% CHAR%”.
Zamiast jednego zapytania na kolumnę, możesz zbudować jedno zapytanie na tabelę w następujący sposób:
źródło
all_tab_columns
nieall_tables
. Naprawiłem to.Dokonałem pewnej modyfikacji powyższego kodu, aby działał szybciej, jeśli szukasz tylko jednego właściciela. Wystarczy zmienić 3 zmienne v_owner, v_data_type i v_search_string, aby pasowały do tego, czego szukasz.
źródło
'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" = :1'
dbms_output
? Ponieważ zapytania są pomyślnie wykonywane w DataGrip, ale nie widzę żadnego wyniku po.Oto kolejna zmodyfikowana wersja, która porówna niższe dopasowanie podciągów. Działa to w Oracle 11g.
źródło
Tak, możesz, a Twój administrator danych będzie Cię nienawidzić i zauważy, że przybijasz swoje buty do podłogi, ponieważ spowoduje to wiele operacji wejścia / wyjścia i obniży wydajność bazy danych w miarę czyszczenia pamięci podręcznej.
na początek.
Zacząłbym od uruchomionych zapytań, używając
v$session
iv$sqlarea
. To zmienia się w zależności od wersji Oracle. Spowoduje to zawężenie przestrzeni i nie uderzy we wszystko.źródło
Wiem, że to stary temat. Ale widzę komentarz do pytania, w którym pyta się, czy można to zrobić
SQL
zamiast używaćPL/SQL
. Więc pomyślałem, aby opublikować rozwiązanie.Poniższa demonstracja ma na celu wyszukanie WARTOŚCI we wszystkich KOLUMNACH wszystkich TABEL w całym SCHEMACIE :
Poszukajmy wartości
KING
wSCOTT
schemacie.Poszukajmy wartości
20
wSCOTT
schemacie.źródło
Error occurred in XML processing ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
Zrobiłbym coś takiego (generuje wszystkie potrzebne selekcje). Możesz później przekazać je do sqlplus:
Daje:
A to, co robi, to - dla każdego
table_name
z nichuser_tables
pobierz każde pole (z desc) i utwórz wybierz * z tabeli, gdzie pole równa się „val”.źródło
Zmodyfikowałem skrypt Flooda, aby był wykonywany raz dla każdej tabeli, a nie dla każdej kolumny każdej tabeli, aby przyspieszyć wykonywanie. Wymaga Oracle 11g lub nowszego.
źródło
Miałem następujące problemy dotyczące odpowiedzi @Lalit Kumars,
Rozwiązanie to:
źródło
jeśli znamy nazwy tabel i kolumn, ale chcemy dowiedzieć się, ile razy ciąg występuje dla każdego schematu:
źródło
Procedura przeszukiwania całej bazy danych:
Wykonaj instrukcję
Przykładowe wyniki
źródło
Nie mam prostego rozwiązania na promprt SQL. Jednak istnieje sporo narzędzi, takich jak ropucha i programista PL / SQL, które mają GUI, w którym użytkownik może wprowadzić ciąg do przeszukania i zwróci tabelę / procedurę / obiekt, w którym to zostanie znalezione.
źródło
Jest kilka bezpłatnych narzędzi, które umożliwiają tego rodzaju wyszukiwanie, na przykład ten działa dobrze, a kod źródłowy jest dostępny: https://sites.google.com/site/freejansoft/dbsearch
Aby korzystać z tego narzędzia, potrzebujesz sterownika Oracle ODBC i nazwy DSN.
źródło
Modyfikowanie kodu w celu wyszukiwania bez rozróżniania wielkości liter przy użyciu zapytania LIKE zamiast wyszukiwania dokładnych dopasowań ...
źródło
- uruchomiono zakończone - bez błędu
źródło
Pożyczanie, nieznaczne ulepszanie i upraszczanie z tego posta na blogu wydaje się, że następująca prosta instrukcja SQL działa całkiem dobrze:
źródło
źródło