在整个oracle数据库中搜索字符串的一部分

时间:2013-09-09 16:22:07

标签: sql oracle plsql

我正在尝试在整个Oracle数据库中查找特定字符串。

我已经按照这里的另一个主题(Search All Fields In All Tables For A Specific Value (Oracle))中的示例进行了操作,并且当字符串是列中的整个值时它正在工作。但我需要搜索字符串作为列的一部分。

例如,如果我搜索“警报”,它应该返回所有列中包含“警报”的列和所有包含“警报_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;
/

我认为它接近“使用'警告';”我需要添加一些东西,但我不知道是什么。

由于

2 个答案:

答案 0 :(得分:1)

将其更改为

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

答案 1 :(得分:0)

您可以将bind变量与通配符%字符连接起来:

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

请注意,单引号必须通过将它们加倍来进行转义。