ORACLE使用BLOB列搜索字符串的所有表

时间:2014-06-20 03:32:34

标签: oracle stored-procedures blob

我正在尝试使用String搜索所有表,但它似乎不适用于BLOB列。我从一个论坛得到了这个程序。它正在搜索字符串但不在BLOB中。 你能帮帮我吗?

create or replace procedure find_string( p_str in varchar2 )
authid current_user
as
l_query    long;
l_case     long;
l_runquery boolean;
l_tname    varchar2(30);
l_cname    varchar2(30);
l_x        number;
begin
dbms_application_info.set_client_info( '%' || upper(p_str) || '%' );

for x in (select * from user_tables )
loop
l_query := 'select ''' || x.table_name || ''', $$
                         from ' || x.table_name || '
                       where rownum = 1 and ( 1=0 ';
           l_case := 'case ';
           l_runquery := FALSE;
           for y in ( select *
                        from user_tab_columns
                       where table_name = x.table_name
                    )
           loop
               l_runquery := TRUE;
               l_query := l_query || ' or upper(' || y.column_name ||
                          ') like userenv(''client_info'') ';
              l_case := l_case || ' when upper(' || y.column_name ||
                         ') like userenv(''client_info'') then ''' ||
                         y.column_name || '''';
           end loop;
           if ( l_runquery )
           then
               l_case := l_case || ' else NULL end';
               l_query := replace( l_query, '$$', l_case ) || ')';
              begin
                   execute immediate l_query into l_tname, l_cname;
                   dbms_output.put_line
                   ( 'Found in ' || l_tname || '.' || l_cname );
               exception
                   when no_data_found then
                      /*select 0 into l_x from dual;*/
                      dbms_output.put( '.');
               end;
           end if;

      end loop;
   end;

非常感谢!

1 个答案:

答案 0 :(得分:1)

您无法使用普通的SQL字符串操作在BLOB列中搜索字符串。您需要使用dbms_lob包来实现目标。

有关如何完成的示例,请参阅this链接。 Google上也有很多可以为您提供进一步指导的示例。