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

Oracle Cari semua tabel semua kolom untuk string

Minimal, Anda perlu menanyakan ALL_TAB_COLUMNS, bukan ALL_TABLES

DECLARE
  match_count integer;
  v_search_string varchar2(4000) := <<string you want to search for>>;
BEGIN  
  FOR t IN (SELECT owner, table_name, column_name FROM all_tab_columns) LOOP   
    EXECUTE IMMEDIATE    
      'SELECT COUNT(*) FROM '||t.owner || '.' || t.table_name||
      ' WHERE '||t.column_name||' = :1'   
       INTO match_count  
      USING v_search_string; 
    IF match_count > 0 THEN 
      dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count );
    END IF; 
  END LOOP;
END;
/

Namun, jika Anda mencari string, Anda hampir pasti ingin membatasi diri untuk mencari kolom yang dapat menyimpan string. Tidak masuk akal, misalnya, untuk mencari string di kolom DATE. Dan kecuali jika Anda memiliki banyak pengetahuan apriori tentang apa isi kolom BLOB dan kemampuan untuk mengurai format biner kolom BLOB, tidak masuk akal untuk mencari kolom BLOB untuk string. Mengingat itu, saya curiga Anda menginginkan sesuatu yang lebih seperti

DECLARE
  match_count integer;
  v_search_string varchar2(4000) := <<string you want to search for>>;
BEGIN  
  FOR t IN (SELECT owner,
                   table_name, 
                   column_name 
              FROM all_tab_columns
             WHERE data_type in ('CHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2', 
                                 'CLOB', 'NCLOB') ) 
  LOOP   
    BEGIN
      EXECUTE IMMEDIATE    
        'SELECT COUNT(*) FROM '||t.owner || '.' || t.table_name||
        ' WHERE '||t.column_name||' = :1'   
         INTO match_count  
        USING v_search_string; 
      IF match_count > 0 THEN 
        dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count );
      END IF; 
    EXCEPTION
      WHEN others THEN
        dbms_output.put_line( 'Error encountered trying to read ' ||
                              t.column_name || ' from ' || 
                              t.owner || '.' || t.table_name );
    END;
  END LOOP;
END;
/

Tentu saja, ini akan menjadi sangat lambat-- Anda akan memindai penuh setiap tabel sekali untuk setiap kolom string dalam tabel. Dengan tabel yang cukup besar dan jumlah kolom string yang moderat, hal itu mungkin akan memakan waktu cukup lama.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01461:dapat mengikat nilai PANJANG hanya untuk dimasukkan ke dalam kolom PANJANG - Terjadi saat kueri

  2. Cara memodifikasi tipe data di Oracle dengan baris yang ada di tabel

  3. SQL untuk menemukan kata-kata huruf besar dari kolom

  4. ORA-1114 Menjalankan Datapatch

  5. Metode Pengumpulan:Prosedur HAPUS Dalam Database Oracle