Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Как правильно выйти из цикла в курсоре?


Автор: Лапоть 14.3.2014, 08:16
Здравствуйте все!
Есть функция... с нюансом:
Код
    create or replace
    function LMM_ALTNAMES(REG_ID in int) return varchar2 is
      cursor cur is select GN.GEONAME.GEONAME
                    from GN.GEONAME  
                    where REG_ID = GN.GEONAME.REG_N and GN.GEONAME.NORM = 0
                    order by GN.GEONAME.GEONAME;
      anames varchar2(1000);
      aname  varchar2(100);
    begin
      anames := NULL;
      open cur;
      loop
        fetch cur into aname;
        if aname is NULL    /* без этого при пустом датасете цикл срабатывает один раз */      
          then exit;
        anames := concat(anames, aname);
        anames := concat(anames, '\n');  /* ??? для Rave Reports DataMemo, ещё не проверял... */
        exit when cur%NOTFOUND;
      end loop;
      close cur;
      return anames;
    end LMM_ALTNAMES;

Если датасет непустой, то последняя запись дублируется:
Код
Connecting to the database homedb_gn.
v_Return = Адыгейск\nТеучежск\nТеучежск\n << два раза!!!
Process exited.
Disconnecting from the database homedb_gn.

Как корректно выйти из цикла?


Автор: Лапоть 14.3.2014, 22:16
Вышел smile 
Код
    create or replace
    function    LMM_ALTNAMES(REG_ID in int) return varchar2 is
      cursor cur is select GN.GEONAME.GEONAME
                    from GN.GEONAME  
                    where REG_ID = GN.GEONAME.REG_N and GN.GEONAME.NORM = 0
                    order by GN.GEONAME.GEONAME;
      anames varchar2(1000);
      aname  varchar2(100);
    begin
      anames := NULL;
      open cur;
      loop
        fetch cur into aname;
        exit when cur%NOTFOUND;  
        anames := concat(anames, aname);
        anames := concat(anames, '\n');      
      end loop;      
      close cur;
      return rtrim(anames);
    end LMM_ALTNAMES;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)