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

在Oracle的PL/SQL中使用游标搜索特定数据的特定行,oracle,oracle11g,Oracle,Oracle11g,我是PL/SQL新手,我正在尝试从模式中搜索特定的数据。我想使用嵌套游标并使查询成为动态的。请帮我解决这个问题。下面是一个使用循环(尽管不是嵌套循环,我不知道为什么)和动态SQL(立即执行)的示例 它基于Scott的模式;我正在查找员工姓名“KING”在当前模式的所有表(查询USER\u表)中ENAME列(查询USER\u选项卡列)中的出现次数 这只是给你一个想法;欢迎进一步开发 一些样本数据: SQL> set serveroutput on SQL> select ename f

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

下面是一个使用循环(尽管不是嵌套循环,我不知道为什么)和动态SQL(立即执行)的示例

它基于Scott的模式;我正在查找员工姓名“KING”在当前模式的所有表(查询
USER\u表
)中
ENAME
列(查询
USER\u选项卡列
)中的出现次数

这只是给你一个想法;欢迎进一步开发

一些样本数据:

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
让我们来寻找那个国王:

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和奖金表中出现一次。

试试这个

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');

欢迎来到SO!请提供更多的细节,比如你到目前为止尝试过什么?