create or replace procedure p_query_table_by_condition /** * name : p_query_table_by_condition * purpose : 根据条件查该条件出现在那张表 * revisions: * version date author description * ---------------- ---------- ------------------ --------------------------------- * 1.0 2010-12-10 zhangzheng 创建 */ ( v_input in varchar2, --传入要查询的条件 tablename_result out sys_refcursor, --该用户下的所有表 columnname_result out sys_refcursor, --每一个表下的所有列 cur_result out sys_refcursor, --符合条件的记录集 name_text out varchar2 --返回条件所有的表名 ) is tablename varchar2(100); columnname varchar2(100); selectresult varchar2(100); sql_text varchar2(200); begin name_text := ''; sql_text := ''; selectresult := ''; --先查出所有的表的表名存入游标tablename_result中 open tablename_result for select table_name from user_tables; --开始循环每一张表 loop --取出表名放出变量tablename中 fetch tablename_result into tablename; exit when tablename_result%notfound; dbms_output.put_line('table_name: ' || tablename); --查出每一个表,且类型为varchar2的所有字段名存入游标columnname_result中 open columnname_result for select column_name from user_tab_columns where table_name = tablename and data_type = 'VARCHAR2'; --开始循环字段记录集游标 loop --取出字段名存入变量columnname中 fetch columnname_result into columnname; exit when columnname_result%notfound; dbms_output.put_line('columnname: ' || columnname); --构造查询语句 sql_text := 'select ' || columnname || ' from ' || tablename || ' where ' || columnname || ' = ' || '''' ||v_input|| ''''; dbms_output.put_line('sql_text: ' || sql_text); --为游标cur_result赋值 open cur_result for sql_text; --循环遍历游标cur_result loop fetch cur_result into selectresult; exit when cur_result%notfound; --如果没有,退出本次循环,如果有,则证明输入的条件找到了符合的表名,直接返回 if (cur_result%rowcount = 0) then exit; end if; if (cur_result%rowcount != 0) then name_text := tablename; return; end if; end loop; --execute immediate sql_text; end loop; end loop; exception when others then rollback; --打印错误code及错误信息 dbms_output.put_line(sqlcode || ': ' || sqlerrm); name_text := '未知'; close tablename_result; close columnname_result; end p_query_table_by_condition;