Forum Stats

  • 3,873,147 Users
  • 2,266,509 Discussions
  • 7,911,435 Comments

Discussions

全テーブルの全列の値の検索方法について

890990
890990 Member Posts: 27
edited Jan 16, 2012 11:25PM in データベース一般
Oracleにおいて、全テーブルの全列に特定の値が入っていないかを調査することになりました。

やりたいことは、

「全テーブルの全列に特定の値(例:「あ」)が入っていないか?を調査する」です。

テーブル数は約200、全列数は約5000あります。

全列数分5000個のlike検索文を地道に作る方法以外に何かよい方法はありませんでしょうか。

Answers

  • 当方も全角のチルダを探したことがあります。
    declare
     sSQL VARCHAR2(128);
     sDATA VARCHAR2(500);
     type cursor_type is ref cursor;
     cur_search cursor_type;
     vCount INTEGER;
     ERR_CODE NUMBER := 0;
     ERR_MSG VARCHAR(255);
    begin
     for vRec in (select COLUMN_NAME,TABLE_NAME from USER_TAB_COLS where DATA_TYPE like '%CHAR%')
     loop
      begin
        open cur_search for 'select count(*) as cnt from ' || vRec.TABLE_NAME || ' where ' || vRec.COLUMN_NAME || ' like ''%あ%''';
            fetch cur_search into vCount;
            if vCount > 0 then
              dbms_output.put_line(vRec.TABLE_NAME || '.' || vRec.COLUMN_NAME || ':' || vCount || '件あり');
            end if;
            close cur_search;
      exception
       WHEN OTHERS THEN
        ERR_CODE := SQLCODE;
        ERR_MSG  := SUBSTRB(SQLERRM,1,255);
        dbms_output.put_line('error:' || ERR_CODE || ' ' || ERR_MSG || ' ' || vRec.TABLE_NAME || '.' || vRec.COLUMN_NAME);
      end;
     end loop;
    end;
    以上、参考になれば幸いです。
  • Blueloco
    Blueloco Member Posts: 118
    以前オーナーモードでexpしたダンプファイルをバイナリエディターを使って検索して調べたことがあります。
    ヒットした箇所から直前の「CREATE TABLE」を前方方向検索してテーブルを特定しました。
    列を特定するのは難しいですが、列値からある絞れる場合も多いと思います。

    邪道な方法かもしれませんが、テーブル数や列数、データ量が多すぎる場合は全テーブル全列全レコードLIKE検索することはかえって現実的ではない、と考えましたので。。
    文字列検索に対応したバイナリーエディタを用意できる(私はWindowsのフリーウェアを使用)ことと、暗号化されてないことが条件となりますが。
  • 890990
    890990 Member Posts: 27
    ご回答頂きましてありがとうございます。
    頂きましたご回答を参考にしまして調査を進めてみたいと思います。

    ありがとうございました。
This discussion has been closed.