在整个架构中搜索字符串

时间:2017-12-05 11:22:40

标签: sql oracle

我有多个模式的Oracle数据库。我想在一个特定模式的所有表中找到xyz字符串。我试着按照这里接受的答案(Search All Fields In All Tables For A Specific Value (Oracle))来做。不幸的是,我收到错误:

3 ORA-00903: invalid table name
ORA-06512: at line 8 SQL.sql 30 2

第8行是

SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||

如何进行全面搜索?我也尝试过其他googled解决方案,但它们都没有为我工作。

2 个答案:

答案 0 :(得分:2)

根据其他答案改编,运行此查询:

SELECT
    'SELECT '''|| owner||table_name||column_name|| ''' as locn, COUNT(*) FROM "' || owner || '"."' || table_name ||'" WHERE "'||column_name||'" = ''[VALUE YOURE LOOKING FOR HERE]'' UNION ALL'
FROM
  all_tab_columns
WHERE owner <> 'SYS' and data_type LIKE '%CHAR%'

用您正在寻找的值替换 [在这里寻找价值] 。也要更换方括号。不要碰任何撇号。

然后运行查询,它将产生大量的sql语句。将它们从查询工具结果网格中复制出来,将它们粘贴到查询区域面板中,删除最后一个联合所有,然后运行它们。等一下很长一段时间最终,它会生成每个表格和列名称的列表,以及您在该列中显示的值所需次数的计数

答案 1 :(得分:0)

您可以通过将所有内容视为带引号的标识符来调整the original code以应对使用区分大小写或其他无效对象标识符创建的表(以及模式和列)。

EXECUTE IMMEDIATE
  'SELECT COUNT(*) FROM "' || t.owner || '"."' || t.table_name || '"' ||
  ' WHERE "'||t.column_name||'" = :1'
  INTO match_count
  USING '1/22/2008P09RR8';

但是当然要使用你正在寻找的任何字符串。

在生成的动态SQL中,所有者,表名和列名现在都用双引号括起来 - 这就是@CaiusJard正在做的事情,但这仍然在匿名块内执行单独的查询。