kutipan:
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 Anda mengharapkan nama kolom 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 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 berada di objek tabel bersarang. Jadi, Anda mungkin mengejar angsa liar mencoba memeriksa setiap kolom untuk nilai itu. Tidak bisakah Anda 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 hal ini, berdasarkan nilai yang Anda cari, Anda dapat dengan jelas menghilangkan kolom apa pun yang bertipe NUMBER atau DATE, yang akan mengurangi jumlah kueri. Bahkan mungkin membatasinya pada kolom yang tipenya 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'
...
;