加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle搜索所有表所有列的字符串

发布时间:2020-12-12 13:49:17 所属栏目:百科 来源:网络整理
导读:参见英文答案 Search All Fields In All Tables For A Specific Value (Oracle)12个 我需要在所有表和列中搜索我们的oracle数据库中的字符串.我有下面的查询我发现在线,但是当我执行它,我得到以下错误 任何帮助是赞赏 ORA-06550: line 6,column 31:PL/SQL: O
参见英文答案 > Search All Fields In All Tables For A Specific Value (Oracle)12个
我需要在所有表和列中搜索我们的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;
/

当然,这将是非常缓慢的 – 你可以对表中的每个字符串列全面扫描一次表.使用中等大的桌子和中等数量的字符串列,这可能需要相当长的一段时间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读