Mengutip:
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%'
Kolom bukanlah objek. Jika yang Anda maksud Anda mengharapkan nama kolom menjadi seperti '% DTN%', kueri yang Anda inginkan adalah:
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
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:
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;
/
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:
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;