Avatar billede jkarly Nybegynder
12. april 2002 - 09:39 Der er 9 kommentarer og
1 løsning

Count af antal records i en cursor.

Er der en måde hvorved man kan counte hvor mange records der er i en cursor i pl/sql?

Jeg arbejder på et online system hvor jeg gerne vil vise brugeren hvor mange records jeg har og samtidig vise dem på skærmen.

Derfor har jeg set  flere eksempler på at man først har lavet en count med en sql sætning og derefter lavet selve cursoren der henter dataerne. Da det kan være ret komplekse sql sætninger fordobler man derfor tiden det tager at hente data, og det er selvfølgelig ikke så godt

Håber der er nogen der har en god ide.
Avatar billede teepee Nybegynder
12. april 2002 - 10:01 #1
Hvis du alligevel skal vise dem på skærmen kan du jo blot loop løkken igennem og lade en variabel tælle antallet af rækker mens du looper.

vCount=0;
for rec in cRec loop
  ....
  vCount=vCount+1;
end loop;


Alternativt kan du smide rækkerne over i en pl/sql table og benytte [table].count
Avatar billede jkarly Nybegynder
12. april 2002 - 10:09 #2
Det har strejfet mig, jeg løber ikke hele cursoren igennem.
Hvad angår [table].count kan du så ikke vise mig hvordan du gør, for jeg kan ikke få det til at virke.

På forhånd tak.

Det ville være nemmere hvis man både kun fetche og baglæns i en cursor, men det kan man vist ikke :)
Avatar billede jkarly Nybegynder
12. april 2002 - 10:10 #3
Forlæns og baglæns mente jeg selvfølgelig.
Avatar billede teepee Nybegynder
12. april 2002 - 10:22 #4
Man kan kun bevæge sig forlæns i cursore, med mindre man bruger C og ikke PL/SQL. Man kan IKKE counte antallet uden en loop. Hvis du overfører data til en PL/SQL table har du alligevel loopet data igennem og kunne lige så godt have talt dem. Til gengæld kan du loope forlæns OG baglæns i en PL/SQL table OG du kan tælle med .Count.

Syntax (IKKE checket) i PL/SQL table:

tListe is table of varchar2(200) index by binary_integer;
x binary_integer:=0;
cursor cListe is
  select name from table1;

for rListe in cListe loop
x:=x+1;
tListe(x):=rListe.name;
-- x giver sådan set antallet
end loop;

vCount := tListe.Count; -- giver antallet
x:= tListe.first; -- giver "pointer til første entry"
x:= tListe.last;  -- gæt selv
x:= tListe(x).prior; -- sætter x fra nuværende til forrige
x:= tListe(x).next; -- gæt selv
Avatar billede jkarly Nybegynder
17. april 2002 - 16:55 #5
Grunden til at jeg afviser dit svar er at vi arbejder med så store datastørrelser at det ville fylde for meget i hukommelsen.
Det kan nok bare ikke lade sig gøre på en nem måde :(
Avatar billede teepee Nybegynder
17. april 2002 - 17:12 #6
Hvis du bare laver det til x antal arrays af enkelt kolonner kan du lave en

open cursorx;
fetch cursorx bulk collect into array1, array2... osv.;
close cursorx;

Herefter er cursoren lukket og du har alle data i arrays i stedet for din cursor og du kan arbejde på stort set samme måde. Det fylder altså ikke mere end i en cursor.

Når du så skal tælle, er det lige meget hvilket af dine arrays du laver en array.count på.
Avatar billede teepee Nybegynder
17. april 2002 - 17:13 #7
PS Har selv prøvet at det virker på arrays med 200.000.000 rækker så mon ikke I kan bruge det?
Avatar billede wagner Nybegynder
20. juni 2002 - 01:38 #8
Hvis du bare vil have antal rækker i din cursor kan du benytte:
cursornavn%ROWCOUNT
så burde det virke.
Avatar billede psv Nybegynder
28. august 2002 - 14:07 #9
wagner: Jeg håber ikke du selv benytter dig af det. Det passer nemlig ikke :-)

%ROWCOUNT er det antal rækker du har "fetched"... På en nyåbnet cursor er den altid 0.
Avatar billede jkarly Nybegynder
29. august 2002 - 08:58 #10
Så er det vist på tide at få lukket den her sag, selv om der vist ikke er kommet et rigtig godt svar :(

Jeg giver teepee min points da han vist kom med det bedste svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester