如何在oracle plsql中使用inner for循环时防止重复值?

时间:2015-06-01 09:49:38

标签: plsql oracle11g

我将c1值作为参数传递给c2,c3游标,所以我得到重复的值以及如何使用plsql代码编写比这段代码更好的内容?

Declare
      cursor cur1;
      cursor  cur2
      is
      select * from 
      where param=c1.param;

      cursor  cur3
      is
      select * from 
      where param=c1.param;
    Begin
       for c1 loop
         for c2(c1.param)
           dbms_output(deptno||' '||dname);
          for c3(c1.param)
           dbms_output(deptno||' '||dname);
          end loop;
        end loop;
       end loop;
    End;

    So , i am getting duplicate values 

    deptno  dname
    10       a
    20       b
    30       c
    10       a
    20       b
    30       c
Expected output as
    deptno  dname
    10       a
    20       b
    30       c
你能帮我吗?

2 个答案:

答案 0 :(得分:1)

听起来你可能想要一个UNION:

Declare
  cursor cur1;

  cursor  cur2 is
     select * from X
     where param=c1.param
     union
     select * from Y
     where param=c1.param;
Begin
   for c1 loop
     for c2(c1.param)
       dbms_output(deptno||' '||dname);
      end loop;
   end loop;
End;

(我还没有修复上面的无效代码 - 大概是你的真实代码是正确的,或者它根本就没有运行。)

你可能不需要2个游标,你可以这样做:

Declare
  cursor  cur is
     select * from X
     where param in (select ...)
     union
     select * from Y
     where param in (select ...)
Begin
   for c2 in cur loop
      dbms_output(deptno||' '||dname);
   end loop;
End;

答案 1 :(得分:0)

  1. 您可以使用内部联接来避免游标循环。
  2. 使用distinct关键字获取不同的值。
  3. rownum keword的用户只能获得一行。
  4. 通过group by子句消除重复。