Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle Search wszystkie tabele wszystkie kolumny dla ciągu znaków

Musisz co najmniej wysłać zapytanie do ALL_TAB_COLUMNS, a nie 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;
/

Jeśli jednak szukasz ciągu, prawie na pewno chciałbyś ograniczyć się do szukania kolumn, które mogą przechowywać ciąg. Na przykład nie ma sensu przeszukiwać kolumny DATE w poszukiwaniu ciągu. I jeśli nie masz dużej wiedzy a priori na temat tego, co zawiera kolumna BLOB i możliwości analizowania formatowania binarnego kolumny BLOB, nie ma sensu przeszukiwać kolumny BLOB w poszukiwaniu ciągu. Biorąc to pod uwagę, podejrzewam, że chcesz czegoś więcej

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;
/

Oczywiście będzie to szalenie powolne — przeskanowałbyś w pełni każdą tabelę raz dla każdej kolumny ciągu w tabeli. Przy umiarkowanie dużych tabelach i umiarkowanej liczbie kolumn z ciągami może to zająć trochę czasu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zapakować PL SQL Code w Oracle?

  2. Jak zwiększyć bufor dbms_output?

  3. Oracle ORA-30004 przy użyciu funkcji SYS_CONNECT_BY_PATH,

  4. Jak ustawić region strefy czasowej dla połączenia JDBC i uniknąć nieznalezionego regionu strefy czasowej SqlException?

  5. Oracle — widok zmaterializowany nadal dostępny po całkowitym odświeżeniu. Jak to działa?