sql >> データベース >  >> RDS >> Oracle

Oracleすべてのテーブルのすべての列で文字列を検索

    少なくとも、ALL_TABLESではなくALL_TAB_COLUMNSをクエリする必要があります

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

    ただし、文字列を探している場合は、文字列を格納できる列を探すように制限することをお勧めします。たとえば、DATE列で文字列を検索しても意味がありません。また、BLOB列に含まれる内容と、BLOB列のバイナリ形式を解析する機能について事前に十分な知識がない限り、BLOB列で文字列を検索することは意味がありません。それを考えると、あなたはもっと似たようなものが欲しいと思います

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

    もちろん、これはめちゃくちゃ遅くなります。テーブル内のすべての文字列列に対して、すべてのテーブルを1回フルスキャンします。適度に大きなテーブルと適度な数の文字列列がある場合、かなり時間がかかる可能性があります。




    1. WITHENCRYPTIONの内部

    2. oraclesqlからpandasdfへのデータのロードを高速化する方法

    3. 列のサイズを変更する方法

    4. FOREIGN KEY制約によって参照されているため、オブジェクトを削除できませんでした-SQL Server/TSQLチュートリアルパート74