oracle数据库根据列值溯源表名和列名

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/markximo/article/details/79583527

数据库:oracle11g 11.2.0
工具:Oracle SQL Developer 17.2.0.188

我只知道数据库中某个表的某个列的某行中存在一个值”RoyDD”,现在希望寻找到这个值所在表及对应字段。

DECLARE  
CURSOR cur_query IS   
  SELECT table_name, column_name, data_type FROM user_tab_columns;   
  a NUMBER;   
  sql_hard VARCHAR2(2000);   
  vv NUMBER;  
BEGIN   
  FOR rec1 IN cur_query LOOP  
  a:=0;   
  IF rec1.data_type ='VARCHAR2' OR rec1.data_type='CHAR' THEN   
  a := 1;   
  END IF;   
  IF a>0 THEN   
  sql_hard := '';   
  sql_hard := 'SELECT count(*) FROM '|| rec1.table_name ||' where '   
  ||rec1.column_name|| ' like''RoyDD'''; -- RoyDD为字段值   
  dbms_output.put_line(sql_hard);
  EXECUTE IMMEDIATE sql_hard INTO vv;  
  IF vv > 0 THEN dbms_output.put_line('[字段值所在的表.字段]:['||rec1.table_name||'].['||rec1.column_name||']');   
  END IF;  
  END IF;  
  END LOOP;  
END;

注意问题


  1. 执行完成后,发现没有结果输出?
    注意启用DBMS输出,以我的工具为例,在”查看”-“DBMS输出”,打开下图所示界面。点击图中绿色加号,选择连接对应用户,然后再执行上述语句,就可以看到图中所示的”[字段值所在的表.字段]”就是我们要的答案,如果有多个表多个字段存在该值,则会显示多行”[字段值所在的表.字段]”结果。
    Oracle SQL Developer DBMS输出界面
    2.执行报错ORA-20000: ORU-10027: buffer overflow
    缓冲区大小不足,如上图中所示有文本框直接修改大小,也可以通过在begin下方增加DBMS_OUTPUT.ENABLE(1000000);设置大小,还可以直接注释掉dbms_output.put_line(sql_hard);不打印多余语句只打印结果。
展开阅读全文

没有更多推荐了,返回首页