[ darkosos @ 06.07.2010. 09:17 ] @
U sledecem primeru
Code:
declare
  cursor c is ...;
  r c%rowtype;
begin
  open c;
  loop
    fetch c into r;
    exit when c%notfound or (neki uslov);
  end loop;
end;

Interesuje me kakva je vrednost promenljive r po izlasku iz petlje?
I to u slucaju da se desilo c%notfound i da nije.
Pretpostavljam da ako nije, r zadrzava vrednosti poslednjeg sloga iz kursora.
[ steve585 @ 10.07.2010. 16:43 ] @
pa valjda ima vrijednost c redova koji ubaceni u promjenjivu r
[ djoka_l @ 11.07.2010. 00:22 ] @
Tek danas sam video ovo pitanje.

Jednostavno rečeno, vrednost promenljive r nakon što je tačan uslov c%notfound ne treba koristiti. Sad, ti imaš i neki OR uslov, pa ako je program iskočio zbog onoga što je iza OR, tada bi u r mogao da bude poslednji fečovan slog iz kurzora c.

Ako je zaista bilo tačno c%notfoud, tada bi vrednost varijable r mogla da bude ili vrednost poslednjeg fečovanog sloga, ili da sva polja budu null ili da bude potpuno besmislen podatak. Šta je zaista u r moglo bi da zavisi i od verzije baze na kojoj se procedura izvršava. Na primer, ono što sigurno znam je da se, recimo select u varijablu u slučaju kad select vrati TOO_MANY_ROWS promenio tako da je u verziji baze 9 tu bio prvi slog, dok je u 10 vrednost null.

Jedino što je 100% sigurno je da je: ako je c%notfound tačno, vrednost varijable r je NEDIFINISANA i ne treba da bude korišćena.
[ darkosos @ 12.07.2010. 07:17 ] @
Hvala na odgovoru. Ja sam testirao ovo i rekao bih da r zadrzava vrednost bez obzira na %notfound (u mom radnom okruzenju).
Ali verovatno ipak treba biti oprezan s' obzirom na tu pricu sa verzijama baze.
Tako da ako zelim taj poslednji vraceni slog, morao bih da napravim novu promenljivu u kojoj cu drzati tekuce vrednosti iz kursora.
Inace i meni je nekako logicnije da TOO_MANY_ROWS vrati NULL u promenljivu :)