Apakah mungkin untuk mencari setiap bidang dari setiap tabel untuk nilai tertentu di Oracle?
Ada ratusan tabel dengan ribuan baris di beberapa tabel jadi saya tahu ini bisa memakan waktu sangat lama untuk kueri. Tapi satu-satunya hal yang saya tahu adalah bahwa nilai untuk bidang yang ingin saya tanyakan adalah 1/22/2008P09RR8
. <
Saya telah mencoba menggunakan pernyataan di bawah ini untuk menemukan kolom yang sesuai berdasarkan apa yang menurut saya harus dinamai tetapi tidak memberikan hasil.
SELECT * from dba_objects
WHERE object_name like '%DTN%'
Sama sekali tidak ada dokumentasi di database ini dan saya tidak tahu dari mana bidang ini ditarik.
Ada pemikiran?
Jawaban:
Mengutip:
Kolom bukanlah objek. Jika yang Anda maksud Anda mengharapkan nama kolom menjadi seperti '% DTN%', kueri yang Anda inginkan adalah:
Tetapi jika string 'DTN' hanyalah tebakan di pihak Anda, itu mungkin tidak akan membantu.
Omong-omong, seberapa yakin Anda bahwa '1/22 / 2008P09RR8' adalah nilai yang dipilih langsung dari satu kolom? Jika Anda tidak tahu sama sekali dari mana asalnya, itu bisa berupa rangkaian beberapa kolom, atau hasil dari beberapa fungsi, atau nilai yang ada di objek tabel bertingkat. Jadi, Anda mungkin melakukan pengejaran liar mencoba memeriksa setiap kolom untuk nilai itu. Bisakah Anda tidak memulai dengan aplikasi klien apa pun yang menampilkan nilai ini dan mencoba mencari tahu kueri apa yang digunakan untuk mendapatkannya?
Bagaimanapun, jawaban diciu memberikan satu metode untuk menghasilkan kueri SQL untuk memeriksa setiap kolom dari setiap tabel untuk nilainya. Anda juga dapat melakukan hal serupa seluruhnya dalam satu sesi SQL menggunakan blok PL / SQL dan SQL dinamis. Berikut beberapa kode yang ditulis dengan tergesa-gesa untuk itu:
Ada beberapa cara untuk membuatnya lebih efisien juga.
Dalam kasus ini, dengan nilai yang Anda cari, Anda dapat dengan jelas menghilangkan kolom apapun yang berjenis NOMOR atau TANGGAL, yang akan mengurangi jumlah kueri. Mungkin bahkan membatasinya ke kolom dengan tipe seperti '% CHAR%'.
Alih-alih satu kueri per kolom, Anda bisa membuat satu kueri per tabel seperti ini:
sumber
all_tab_columns
notall_tables
. Saya sudah memperbaikinya.Saya melakukan beberapa modifikasi pada kode di atas untuk membuatnya bekerja lebih cepat jika Anda mencari hanya di satu pemilik. Anda hanya perlu mengubah 3 variabel v_owner, v_data_type dan v_search_string agar sesuai dengan yang Anda cari.
sumber
'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" = :1'
dbms_output
? Karena kueri berhasil dieksekusi di DataGrip, tetapi saya tidak melihat hasil apa pun setelahnya.Berikut adalah versi modifikasi lain yang akan membandingkan kecocokan substring yang lebih rendah. Ini berfungsi di Oracle 11g.
sumber
Ya, Anda bisa dan DBA Anda akan membenci Anda dan akan menemukan Anda untuk membanting tulang karena hal itu akan menyebabkan banyak I / O dan menurunkan kinerja database saat cache dibersihkan.
sebagai permulaan.
Saya akan mulai dengan kueri yang sedang berjalan, menggunakan
v$session
danv$sqlarea
. Perubahan ini berdasarkan versi oracle. Ini akan mempersempit ruang dan tidak mengenai segalanya.sumber
Saya tahu ini adalah topik lama. Tapi saya melihat komentar untuk pertanyaan yang menanyakan apakah itu bisa dilakukan
SQL
daripada menggunakanPL/SQL
. Jadi berpikir untuk memposting solusi.Demonstrasi di bawah ini adalah untuk Mencari NILAI di semua KOLOM dari semua TABEL di seluruh SKEMA :
Mari kita lihat nilainya
KING
diSCOTT
skema.Mari kita cari nilai
20
dalamSCOTT
skema.sumber
Error occurred in XML processing ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
Saya akan melakukan sesuatu seperti ini (menghasilkan semua pilihan yang Anda butuhkan). Anda nanti dapat memberi mereka makan ke sqlplus:
Ini menghasilkan:
Dan yang dilakukannya adalah - untuk masing-masing
table_name
dariuser_tables
dapatkan setiap bidang (dari desc) dan buatlah * pilih dari tabel di mana bidang sama dengan 'val'.sumber
Saya memodifikasi skrip Flood untuk mengeksekusi satu kali untuk setiap tabel daripada untuk setiap kolom dari setiap tabel untuk eksekusi yang lebih cepat. Ini membutuhkan Oracle 11g atau lebih tinggi.
sumber
Saya mengalami masalah berikut untuk jawaban @Lalit Kumars,
Solusinya adalah:
sumber
jika kita mengetahui nama tabel dan kolom tetapi ingin mengetahui berapa kali string muncul untuk setiap skema:
sumber
Prosedur untuk Mencari Seluruh Database:
Pernyataan Eksekusi
Hasil Sampel
sumber
Saya bukan dari solusi sederhana pada perintah SQL. Namun ada beberapa alat seperti katak dan PL / SQL Developer yang memiliki GUI di mana pengguna dapat memasukkan string yang akan dicari dan akan mengembalikan tabel / prosedur / objek tempat ditemukan.
sumber
Ada beberapa alat gratis yang dapat membuat penelusuran semacam ini, misalnya, alat ini berfungsi dengan baik dan kode sumber tersedia: https://sites.google.com/site/freejansoft/dbsearch
Anda memerlukan driver ODBC Oracle dan DSN untuk menggunakan alat ini.
sumber
Memodifikasi kode untuk mencari case-insensitively menggunakan query LIKE daripada menemukan kecocokan persis ...
sumber
- itu berjalan selesai - tidak ada kesalahan
sumber
Meminjam, sedikit meningkatkan dan menyederhanakan dari posting Blog ini, pernyataan SQL sederhana berikut tampaknya melakukan pekerjaan dengan cukup baik:
sumber
sumber