在Oracle的PL/SQL中使用游标搜索特定数据的特定行
我是PL/SQL新手,我正在尝试从模式中搜索特定的数据。我想使用嵌套游标并使查询成为动态的。请帮我解决这个问题。下面是一个使用循环(尽管不是嵌套循环,我不知道为什么)和动态SQL(立即执行)的示例 它基于Scott的模式;我正在查找员工姓名“KING”在当前模式的所有表(查询在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
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!请提供更多的细节,比如你到目前为止尝试过什么?