0

Oracle データベース全体で特定の文字列を見つけようとしています。

ここの別のトピックの例 ( Search All Fields In All Tables For A Specific Value (Oracle) ) に従いましたが、文字列が列の値全体である場合に機能します。しかし、列の一部として文字列を検索する必要があります。

たとえば、「Alert」を検索すると、「Alert」を含むすべての列と「Alert_QB」を含むすべての列が返されます

これは現時点でのクエリです:

DECLARE
  match_count INTEGER;
BEGIN
  FOR t IN (SELECT owner, table_name, column_name
              FROM all_tab_columns
              WHERE data_type LIKE '%CHAR%') LOOP

    EXECUTE IMMEDIATE
      'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
      ' WHERE '||t.column_name||' = :1'
      INTO match_count
      USING 'ALERT';

    EXCEPTION when others then
    null;
    end;

    IF match_count > 0 THEN
      dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
    END IF;

  END LOOP;

END;
/

「USING 'ALERT';」に近いと思います。何かを追加する必要があるが、何がわからないという行。

ありがとう

4

2 に答える 2

1

に変更します

EXECUTE IMMEDIATE
  'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
  ' WHERE '||t.column_name||' like :1'
  INTO match_count
  USING '%ALERT%';
于 2013-09-09T16:59:43.600 に答える
0

バインド変数をワイルドカード%文字と連結できます。

EXECUTE IMMEDIATE
  'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
  ' WHERE '||t.column_name||' LIKE ''%'' || :1 || ''%'''
  INTO match_count
  USING 'ALERT';

一重引用符は二重にしてエスケープする必要があることに注意してください。

于 2013-09-09T17:02:37.393 に答える