sql >> Database teknologi >  >> RDS >> Oracle

Oracle Søg efter streng i alle tabeller, alle kolonner

Som minimum skal du forespørge ALL_TAB_COLUMNS, ikke 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;
/

Hvis du leder efter en streng, vil du dog næsten helt sikkert begrænse dig til at lede efter kolonner, der kan gemme en streng. Det ville f.eks. ikke give mening at søge i en DATE-kolonne efter en streng. Og medmindre du har en stor a priori-viden om, hvad en BLOB-kolonne indeholder og evnen til at parse BLOB-kolonnens binære formatering, ville det ikke give mening at søge i en BLOB-kolonne efter en streng. I betragtning af det formoder jeg, at du vil have noget mere som

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

Selvfølgelig vil det her gå sindssygt langsomt - du ville fuldscanne hver tabel én gang for hver strengkolonne i tabellen. Med moderat store tabeller og et moderat antal strengkolonner vil det sandsynligvis tage et stykke tid.




  1. SET DATEFIRST – Indstil den første dag i ugen i SQL Server

  2. Ny måde at kopiere filer i SQL Server 2019

  3. I SQL Server, hvordan man pivoterer for flere kolonner

  4. SCD Type 2