0
create or replace PROCEDURE "RESULT" (res1 OUT SYS_REFCURSOR )   
IS   
Cursor c is Select distinct id,fname,lname,dob,gender,address1 from emp where name like '%B%'
  d c%rowtype; 
BEGIN
  OPEN c;
  LOOP
  fetch c into d;
  exit when c%notfound;
  OPEN res1 FOR  select e.id from emp e  where e.poi_user_id IN (d.id);
  End Loop;
END;

程序 RESULT 已编译。

如果我在没有过程的情况下运行查询,我会得到 5 个结果,但是当我使用上面的代码时,它只返回最后一个结果。

SET SERVEROUTPUT ON;

Declare
  c SYS_REFCURSOR;
  id number;
begin
  RESULT(c);
loop
  fetch c into id; -- and other columns if needed
  exit when c%notfound;
  dbms_output.put_line(id);
  end loop;
END;

结果 5

4

1 回答 1

1

你不应该让自己难以理解编码。在这种情况下,您不需要任何循环,一个带有 FILTER 条件的简单 SELECT 就足以满足您的要求。希望下面的查询有所帮助。对于用户“”的命名约定,这也不是一个好的编码实践。

就您的问题而言,REFCURSOR 在保留每次迭代的所有记录并为您打印协作输出方面并不那么聪明。

CREATE OR REPLACE PROCEDURE "RESULT"(
    res1 OUT SYS_REFCURSOR )
IS
BEGIN
  OPEN res1 FOR 
  SELECT e.id FROM emp e 
        WHERE EXISTS
  ( SELECT 1
  FROM emp E1
  WHERE e1.name LIKE '%B%'
  AND e1.poi_user_id = e.id
  );
END;
于 2016-05-03T07:52:09.357 回答