在Oracle中使用PL / SQL中的游标在特定行中搜索特定数据

时间:2018-08-23 18:11:13

标签: oracle oracle11g

我是PL / SQL的新手,我正在尝试从架构中搜索特定数据。我想使用嵌套游标并使查询动态化。请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

这是一个使用循环的示例(不过,您不希望使用嵌套循环-我不确定为什么)和动态SQL(立即执行)。

它基于Scott的架构;我正在USER_TABLES列(查询ENAME)内的当前模式(查询USER_TAB_COLUMNS)的所有表中查找雇员姓名“ KING”的出现次数。

这只是为了给您一个想法;随时进行进一步开发。

一些示例数据:

SQL> set serveroutput on
SQL> select ename from emp order by ename;

ENAME
----------
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SMITH
TURNER
WARD

12 rows selected.

SQL> select ename from bonus;

ENAME
----------
KING

让我们搜索那个KING人:

SQL> declare
  2    l_str varchar2(500);
  3    l_cnt number := 0;
  4  begin
  5    for cur_r in (select u.table_name, u.column_name
  6                  from user_tab_columns u, user_tables t
  7                  where u.table_name = t.table_name
  8                    and u.column_name = 'ENAME'
  9                 )
 10    loop
 11      l_str := 'SELECT COUNT(*) FROM ' || cur_r.table_name ||
 12              ' WHERE ' || cur_r.column_name || ' like (''%KING%'')';
 13
 14      execute immediate (l_str) into l_cnt;
 15
 16      if l_cnt > 0 then
 17        dbms_output.put_line(l_cnt ||' : ' || cur_r.table_name);
 18      end if;
 19    end loop;
 20  end;
 21  /
1 : EMP
1 : BONUS

PL/SQL procedure successfully completed.

SQL>

结果表明,KING在EMP和BONUS表中出现一次。

答案 1 :(得分:0)

尝试一下。

SET SERVEROUTPUT ON SIZE 100000


----Final OP----------------------
CREATE OR REPLACE PROCEDURE StringQuery(names VARCHAR2)
IS
  match_count INTEGER;
  v_data_type VARCHAR2(255) :='VARCHAR2';
  v_search_string VARCHAR2(4000) :=names;

BEGIN
  FOR t IN (SELECT table_name, column_name FROM user_tab_columns where data_type = v_data_type) 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( 'Table Name: '||t.table_name ||', Column Name: '||t.column_name||', Found This Many Times: '||match_count );
      --EXECUTE IMMEDIATE 'SELECT * FROM '||t.table_name||'WHERE '||t.column_name||'='||v_search_string||' ';
    END IF;
  END LOOP;
END;
/

CALL StringQuery('&Enter_String_Value');