参见英文答案 >
Search All Fields In All Tables For A Specific Value (Oracle)12个
我需要在所有表和列中搜索我们的oracle数据库中的字符串.我有下面的查询我发现在线,但是当我执行它,我得到以下错误
我需要在所有表和列中搜索我们的oracle数据库中的字符串.我有下面的查询我发现在线,但是当我执行它,我得到以下错误
任何帮助是赞赏
ORA-06550: line 6,column 31: PL/sql: ORA-00904: "COLUMN_NAME": invalid identifier ORA-06550: line 6,column 12: PL/sql: sql Statement ignored ORA-06550: line 8,column 30: PLS-00364: loop index variable 'T' use is invalid ORA-06550: line 7,column 4: PL/sql: Statement ignored ORA-06550: line 12,column 38: PLS-00364: loop index variable 'T' use is invalid ORA-06550: line 12,column 16: PL/sql: Statement ignored BEGIN FOR t IN (SELECT table_name,column_name FROM all_tables) LOOP EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||t.table_name||' WHERE '||t.column_name||' = :1' INTO match_count USING v_search_string; IF match_count > 0 THEN dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count ); END IF; END LOOP; END; /
至少您需要查询ALL_TAB_COLUMNS,而不是ALL_TABLES
DECLARE match_count integer; v_search_string varchar2(4000) := <<string you want to search for>>; BEGIN FOR t IN (SELECT owner,table_name,column_name FROM all_tab_columns) LOOP EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||t.owner || '.' || t.table_name|| ' WHERE '||t.column_name||' = :1' INTO match_count USING v_search_string; IF match_count > 0 THEN dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count ); END IF; END LOOP; END; /
但是,如果您正在寻找一个字符串,您几乎肯定会限制自己寻找可以存储字符串的列.例如,在DATE列中搜索字符串是没有意义的.除非您对BLOB列的含义有很多先验知识,还有解析BLOB列的二进制格式的功能,那么在BLOB列中搜索字符串是没有意义的.鉴于此,我怀疑你想要更像一些东西
DECLARE match_count integer; v_search_string varchar2(4000) := <<string you want to search for>>; BEGIN FOR t IN (SELECT owner,column_name FROM all_tab_columns WHERE data_type in ('CHAR','VARCHAR2','NCHAR','NVARCHAR2','CLOB','NCLOB') ) LOOP BEGIN EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||t.owner || '.' || t.table_name|| ' WHERE '||t.column_name||' = :1' INTO match_count USING v_search_string; IF match_count > 0 THEN dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count ); END IF; EXCEPTION WHEN others THEN dbms_output.put_line( 'Error encountered trying to read ' || t.column_name || ' from ' || t.owner || '.' || t.table_name ); END; END LOOP; END; /
当然,这将是非常缓慢的 – 你可以对表中的每个字符串列全面扫描一次表.使用中等大的桌子和中等数量的字符串列,这可能需要相当长的一段时间.