因此,您希望对数据库执行类似Google的自由文本搜索.这可以做到,但性能将是Teh Suck!谷歌很快,因为它的索引上有索引,有重复的数据存储,并且通常会优化所有这些搜索.
无论如何,这是使用动态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>
Run Code Online (Sandbox Code Playgroud)
更强大的实现可能需要处理大小写,整个单词等.如果你是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') )
Run Code Online (Sandbox Code Playgroud)
显然,我们需要在生成的语句中为拥有的模式添加前缀.
execute immediate 'select null from '||r.owner||'.'||r.table_name
||' where '||r.column_name||' like ''%
Run Code Online (Sandbox Code Playgroud)