[ORACLE/SQL] Recordcount

Pagina: 1
Acties:
  • 267 views sinds 30-01-2008
  • Reageer

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 21:35
Ik heb vandaag mijn Access DB naar een oracle database omgezet, met succes. Ik zit alleen met een klein probleem, waar ik niet uitkom. Ik wil een query uitvoeren en de gegevens in een recordset stoppen. Daarna wil het de recordcount van de recordset opvragen. Bij de Access-database ging dat als volgt:

ASP:
1
2
3
4
5
dim strSQL, rsMEDEWERKER
strSQL = "SELECT MedewerkerID FROM Medewerker"
set rsMEDEWERKER = Server.CreateObject("ADODB.Recordset")  
rsMEDEWERKER.Open strSQL, DBConn, 3,3
Response.Write("Recordcount = " & rsMEDEWERKER.Recordcount & "<bR>")


Als ik deze code uitvoer bij de oracle database (versie 8.1.7.4.2) dan is de recordcount altijd -1. Wat moet ik aan de code aanpassen?

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Is het niet zo dat je eerst eens door de recordset moet lopen vooraleer 'recordcount' is ingevuld. Door de recordset lopen kun je met .movelast en .movefirst.

ps: In de help moet er wel staan waarom .recordcount = 1, niet ?

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Je kan beter een SELECT COUNT(*) uitvoeren op de tabel om het aantal records te weten.

Dat de recordcount op -1 staat heeft waarschijnlijk te maken met de manier waarop je de recordset opent. Daarnaast zal de recordcount waarschijnlijk pas gekend zijn nadat je door de recordset gelopen hebt. In dat geval zal een select count zowiezo sneller zijn.

https://fgheysels.github.io/


  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 21:35
whoami schreef op 10 juli 2003 @ 15:21:
Je kan beter een SELECT COUNT(*) uitvoeren op de tabel om het aantal records te weten.

Dat de recordcount op -1 staat heeft waarschijnlijk te maken met de manier waarop je de recordset opent. Daarnaast zal de recordcount waarschijnlijk pas gekend zijn nadat je door de recordset gelopen hebt. In dat geval zal een select count zowiezo sneller zijn.
Toen ik nog een Access database had, heb ik extra niet voor een SELECT COUNT(*) query gekozen. Met de door mij gemaakte query zie ik direct of er meerdere records in de query zitten. Als er slechts een record in zit, dan kan ik met de gegevens in de recordset verder gaan, waardoor ik slechts een query hoef te gebruiken.

Overigens, de door mij getoonde query werkt in MS Access perfect. Waar zit 'm dan het verschil met de Oracle database?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
TweakersOnly schreef op 10 July 2003 @ 15:28:
[...]


Toen ik nog een Access database had, heb ik extra niet voor een SELECT COUNT(*) query gekozen. Met de door mij gemaakte query zie ik direct of er meerdere records in de query zitten. Als er slechts een record in zit, dan kan ik met de gegevens in de recordset verder gaan, waardoor ik slechts een query hoef te gebruiken.
Loopen door een recordset is trager dan een extra (simpele) query uit te voeren.
Overigens, de door mij getoonde query werkt in MS Access perfect. Waar zit 'm dan het verschil met de Oracle database?
In de driver ofzo zeker.

https://fgheysels.github.io/


Verwijderd

Velen gingen mij voor!

Oracle :

select count(*) from medewerker

Dit is inderdaad de oplossing!

[ Voor 48% gewijzigd door Verwijderd op 10-07-2003 15:32 . Reden: zu spaht ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:31
Dit wordt gezegd over ADO 2.8 Recordcount:
The cursor type of the Recordset object affects whether the number of records can be determined. The RecordCount property will return -1 for a forward-only cursor; the actual count for a static or keyset cursor; and either -1 or the actual count for a dynamic cursor, depending on the data source.
Maw, je kunt er nooit vanuit gaan dat d\je recordcount correct is. Dus niet gebruiken. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

euuuh ja inderdaad ik weet niet waar mensen zo moeilijk over doen en zo veel woorden over vuil aan het maken zijn......

select count(*) from [table]

COUNT(*) counts every record in the table.

Dit is toch echt de meest simpele en doeltreffende methode in mijn ogen.
Verwijderd schreef op 10 July 2003 @ 15:31:
Velen gingen mij voor!

Oracle :

select count(*) from medewerker

Dit is inderdaad de oplossing!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Hier hebben ze het ook over een vergelijkbaar geval:
http://www.experts-exchan...uages/ASP/Q_10935941.html
Het heeft te maken met het server side of client side bestaan van de cursor.

Who is John Galt?


Verwijderd

Volgens mij is een select count(1) is beter voor performance dan een select count(*).

Verwijderd

Dat heb ik ook wel gelezen, maar ik heb het idee dat het verschil minimaal is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
SQL> select count(*) from actb_history;

 COUNT(*)
---------
  3861509



Statistics
----------------------------------------------------------
        166  recursive calls
        608  db block gets
      91156  consistent gets
      90345  physical reads
      46080  redo size
        155  bytes sent via SQL*Net to client
        250  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          4  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> c\*\1\
  1* select count(1) from actb_history
SQL> /

 COUNT(1)
---------
  3861509


Statistics
----------------------------------------------------------
          0  recursive calls
        608  db block gets
      90338  consistent gets
      86412  physical reads
          0  redo size
        170  bytes sent via SQL*Net to client
        250  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


Zo, ff een flinke tabel erbij gepakt :+
Het scheelt wel een procent of 5 in physical reads en gets.
Daarnaast is het aantal recursive calls 0 t.o.v. 165. Ik geloof alleen wel dat dat komt omdat ik net al op die tabel heb zitten queryen. ff testen...

Inderdaad, als ik daarna weer een count(*) doe is het aantal recursive calls ook 0 geworden. Blijkbaar heb ik even in het SGA rondgeschoven met deze queries ;)

Misschien dat het vanaf Oracle v8 niet meer uitmaakt, dat het een tyische 7.3.2 feature was of zo.

[ Voor 33% gewijzigd door Verwijderd op 11-07-2003 15:59 ]


  • rig0r
  • Registratie: Juli 2001
  • Laatst online: 11-03-2025
count(1) zou iets sneller moeten zijn omdat Oracle dan niks met de kolomnamen van de tabel hoeft uit te vogelen. Het verschil in performance is volgens mij verwaarloosbaar :)

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 21:35
Het probleem is opgelost. :) Er zijn verschillende mogelijkheden om een connectiestring naar Oracle te leggen. Met de onderstaande connectiestring en een correcte registratie van de recordset kan ik ook in Oracle de recordcount van een recordset opvragen.

ASP:
1
2
3
4
dim ConnStr, DBConn
ConnStr = "Provider=MSDASQL;DRIVER={Microsoft ODBC for ORACLE};UID=***;PWD=***;Server=***"
SET DBConn = Server.CreateObject("ADODB.Connection")
DBConn.Open ConnStr


Dit topic kan van een slotje worden voorzien. :)

Verwijderd

Waarom parse je niet gewoon de count(*) select? Dan krijg je toch sowieso het gewenste resultaat terug?

Verwijderd

blijft altijd weer terug komen : count(*) of count(1) of count(pk) of ....

zie hier en hier

(8>

  • intGod
  • Registratie: Maart 2003
  • Niet online

intGod

Ars non postulat causam

Verwijderd schreef op 14 July 2003 @ 07:47:
blijft altijd weer terug komen : count(*) of count(1) of count(pk) of ....

zie hier en hier

(8>
Blijft toch dat count(pk) netter is dan count(*) :) Het is dus inderdaad vooral een vormprobleem in Oracle. In Sybase bijvoorbeeld vreet het dan weer wel meer resources.
Pagina: 1