Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cari Semua Bidang Di Semua Tabel Untuk Nilai Tertentu (Oracle)

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'
     ...
     ;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Logika Bisnis:Basis Data atau Lapisan Aplikasi

  2. Permintaan rekursif sederhana di Oracle

  3. Apakah ada cara untuk mendapatkan nomor baris di Mysql seperti rownum di Oracle

  4. Buku Putih Pengoptimal 12c lainnya

  5. Mengapa CONNECT BY LEVEL pada tabel mengembalikan baris tambahan?