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