したがって、データベースに対してGoogleのようなフリーテキスト検索を実行する必要があります。これは可能ですが、パフォーマンスはTeh Suckになります! Googleは、インデックスにインデックスがあり、データストアが重複しており、通常、この種の検索のためにすべてを最適化するため、高速です。
とにかく、これは動的SQLとOracleデータディクショナリを使用した概念実証です。列を検索するデータの種類、つまり文字列に制限していることに注意してください。
SQL> set serveroutput on size unlimited
SQL> declare
2 dummy varchar2(1);
3 begin
4 for r in ( select table_name, column_name from user_tab_cols
5 where data_type in ('VARCHAR2', 'CHAR', 'CLOB') )
6 loop
7 begin
8 execute immediate 'select null from '||r.table_name
9 ||' where '||r.column_name||' like ''%&search_value%'' '
10 ||' and rownum = 1'
11 into dummy;
12 dbms_output.put_line('Found it in >>>'
13 ||r.table_name||'.'||r.column_name);
14 exception
15 when others then
16 -- bad practice ahoy!
17 null;
18 end;
19 end loop;
20 end;
21 /
Enter value for search_value: MAISIE
old 9: ||' where '||r.column_name||' like ''%&search_value%'' '
new 9: ||' where '||r.column_name||' like ''%MAISIE%'' '
Found it in >>>T23.NAME
PL/SQL procedure successfully completed.
SQL>
より堅牢な実装では、大文字と小文字、単語全体などを処理する必要がある場合があります。10g以上を使用している場合は、正規表現が役立つ可能性がありますが、正規表現と動的SQLを組み合わせるのは興味深いことです。 見込み客。
繰り返しますが、パフォーマンスはTeh Suckになります!大規模なデータセット。すべての列にインデックスを付けることはできず、LIKEまたは同様のあいまい一致をサポートしないため、調整することは事実上不可能です。別のアプローチは、XQueryを使用してデータのXML表現を生成し、Textを使用してデータにインデックスを付けることです。このようなリポジトリを維持することはオーバーヘッドになりますが、特に本番環境でこの機能を定期的に必要とする場合、その努力は健全な投資になります。
all_tab_cols
を使用すると、権限のあるすべてのテーブルをより広範囲に検索できます。 代わりは。
for r in ( select owner, table_name, column_name from all_tab_cols
where data_type in ('VARCHAR2', 'CHAR', 'CLOB') )
明らかに、生成されたステートメントで所有スキーマのプレフィックスを付ける必要があります。
execute immediate 'select null from '||r.owner||'.'||r.table_name
||' where '||r.column_name||' like ''%