我有多个模式的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解决方案,但它们都没有为我工作。
答案 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正在做的事情,但这仍然在匿名块内执行单独的查询。