pl/sql huiswerkopdracht kbi 1e jaar

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

  • T-8one
  • Registratie: Oktober 2001
  • Laatst online: 01-09 11:45

T-8one

take it easy, take a sisi

Topicstarter
hey

ik moet voor school een opdracht maken over schoolzwemwedstrijden. Ik heb 4 blaadjes met voorbeelden gekregen die ik dan doormiddel van oracle, sql, pl/sql en developer moet gaan nabouwen.
keb eerst een analyse dmv FCO-IM uitgevoerd en heb nu een aantal tabellen in oracle staan met wat views. dit alles is vrij soepel verlopen maar nu loop ik een beetje vast ( de leraar had me hier al voor gewaarschuwd en gaf al aan dat dit onderdeel het moeilijkst was van de hele opdracht)

het probleem is nu als volgt:
ik heb een table met daarin een eindtijd die leerlingen hebben gezwommen bij het schoolzwemmen voor een bepaald onderdeel (programma) en in een bepaalde serie. (deze table bestaat dus uit drie kolommen: prognr, serie, tijd

Nu moet ik ervoor zorgen dat de persoon met de laagste eindtijd (de snelste) 7 punten krijgt en de tweede 6 pnt en de derde 5pnt enz.
ik dacht eigenlijk dat ik dit heel simpel kon doen dmv een cursor en deze dan laten orderen op tijd maar die blijkt niet te werken.
keb ut aan de leraar gevraagd en die gaf niet zoveel informatie alleen dat ik gebruik moest maken van een functie (wat ik al vermoede).
nu is dus mijn vraag: hoe krijg ik het voor elkaar om een functie te maken die de hoogste tijd ergens uitpikt en daar dan 7 pnt aan toekent en dan aan de tweede tijd 6 pnt geeft. enz.

bvd

karel

GP 32 the most powerfull handheld in the world :P


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:51
Ik zou gewoon door die cursor lopen (de records staan er aflopend in gerangschikt) en dan mbhv een teller die punten per zwemmer toewijzen en iedere keer je een iteratie gedaan hebt die teller verlagen (tot hij aan 0 is, dan laat je hem op 0 staan).

https://fgheysels.github.io/


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
de 7 met de snelste tijd selecteren, gesorteerd op tijd, dan met een loopje ze 1 voor een 7/6/5/4/3/2/1 punten geven.

wat whoami 2 sec eerder zegt dus :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik heb net even zitten kijken en pl/sql is een taal specifiek voor Oracle databases?

Waar komt dit te staan? Is dit een interne procedure die je van buitenaf kan aanroepen?

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op zaterdag 02 maart 2002 15:42 schreef Alarmnummer het volgende:
Ik heb net even zitten kijken en pl/sql is een taal specifiek voor Oracle databases?

Waar komt dit te staan? Is dit een interne procedure die je van buitenaf kan aanroepen?
ik dacht altijd dat het een soort van scriptjes waren zoals VBA in access, maar kan zijn dat ik er al heeel lang naast loop te ouwehoeren :)

EDIT: note to myself: als je er niks vanaf weet, hou je mond! :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:51
PL/SQL is specifiek Oracle idd. Het is een procedurele taal waarmee je SQL en procedurele statements gewoon door elkaar kunt weven. Informix heeft ook zoiets en het heet daar I4GL.

even een voorbeeldje (i4gl):
code:
1
2
3
4
5
6
7
8
DECLARE cur_Personen CURSOR FOR
SELECT * FROM tblPersoon 
ORDER BY tblPersoon.Naam

INITIALIZE p_Persoon.* TO NULL
FOREACH cur_Personen INTO p_Persoon
  PRINT p_Persoon.Naam + " " + p_Persoon.Adres
END FOREACH

Die i4gl code wordt dan uiteindelijk gecompiled tot een uitvoerbaar programma en ik denk dat dat bij PL/SQL niet anders is.

https://fgheysels.github.io/


  • jochemd
  • Registratie: November 2000
  • Laatst online: 31-08 19:19
Waarom niet gewoon SQL gebruiken? Dat is toch veel makkelijker?
Kijk eens wat de volgende query doet (je moet hem misschien nog even optimizen want het is lang geleden dat ik dual heb gebruikt om rownum voor de gek te houden):
code:
1
2
3
select Max(8 - rownum, 0), tijd
from jouw_tabel , dual
where jouw_tabel.tijd = dual.dummy (+)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

De mogelijkheden van SQL zijn nogal beperkt en als ik iets lastig moet doen dan ga ik over op java in combinatie met SQL. Op deze manier heb ik volledige controle erover. En een nadeel van deze aanpak is dat je echt vast komt te zitten aan die oracle db. Ik zou er zelf dus niet snel op overgaan.

  • T-8one
  • Registratie: Oktober 2001
  • Laatst online: 01-09 11:45

T-8one

take it easy, take a sisi

Topicstarter
maar dmv pl\sql wordt het dus mogelijk om functies te maken en deze meerdere keren op te roepen zoals in de eerste twee reacties is gepost.

de reactie met rownum vind ik ook wel aardig, ik vraag me alleen af of het mogelijk is om die cijfers die je dan krijgt nog ergens bij op te tellen. want ik moet ook een totaal overzicht maken van een school voor alle programma's.
dan zou ik dus die rownums bij elkaar op moeten tellen (maar kan dit)

GP 32 the most powerfull handheld in the world :P


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:51
Die query met rownum is idd wel leuk , maar zoals Alarmnummer zegt, moeilijk te porten en ook moeilijker onderhoudbaar.

Je zult ze misschien wel kunnen optellen met COUNT() ofzo. Je kan het resultaat van de query toch ook in een variable steken?

https://fgheysels.github.io/


  • T-8one
  • Registratie: Oktober 2001
  • Laatst online: 01-09 11:45

T-8one

take it easy, take a sisi

Topicstarter
Op zaterdag 02 maart 2002 16:33 schreef whoami het volgende:
Die query met rownum is idd wel leuk , maar zoals Alarmnummer zegt, moeilijk te porten en ook moeilijker onderhoudbaar.
wat is porten?
Je zult ze misschien wel kunnen optellen met COUNT() ofzo. Je kan het resultaat van de query toch ook in een variable steken?
je bedoelt die rownum opslaan in een variable en die dan voor een volgende bewerking weer gebruiken?

GP 32 the most powerfull handheld in the world :P


  • jochemd
  • Registratie: November 2000
  • Laatst online: 31-08 19:19
Op zaterdag 02 maart 2002 16:41 schreef kareltje_de_grote het volgende:

wat is porten?
Overstappen op een andere database. Oracle is bij mijn weten de enige database die op een dergelijke manier gebruik kan maken van de Dual pseudo-tabel. Andere databases hebben dergelijke functionaliteit op een andere manier geimplementeerd.

Er zijn waarschijnlijk tientallen manieren om te doen wat je wil. Sommige zijn inderdaad Oracle only, andere, zoals een extern Java programma, zijn ook naar een andere database te porten. Het hangt er dus helemaal van af wat je wil.

Daar ben je overigens nog steeds niet al te duidelijk in. Is het de bedoeling dat de ranglijst over alle onderdelen elke keer real-time wordt berekend of wil je die in een tabel opslaan? Zo ja, in welke tabel? Hoe koppel je je uitslagentabel vast aan je tabel met deelnemers? Is performance interessant of moet het alleen een proof of concept worden? etc.

  • 80000
  • Registratie: Januari 2002
  • Laatst online: 13-09 17:09

80000

mrox

Alarmnummer:
De mogelijkheden van SQL zijn nogal beperkt en als ik iets lastig moet doen dan ga ik over op java in combinatie met SQL. Op deze manier heb ik volledige controle erover. En
Dit is waar, sommige problemen zijn set problemen, welke je perfect met SQL wil oplossen. Sommige problemen, zoals de poster geeft, schiet SQL tekort en dien je een procedurele taal te gebruiken. In dit geval, aangezien er een loop
gemaakt dient te worden, om meerdere malen (totalen) op te tellen, zou ik een PL/SQL functie gebruiken.
een nadeel van deze aanpak is dat je echt vast komt te zitten aan die oracle db. Ik zou er zelf dus niet snel op overgaan.
Zonder een flame te starten van PL/SQL vs java:
1 - PL/SQL zit in de database en daarmee is de performance
hoger, dan wanneer de (hoge bulk) data over het netwerk getransporteerd moet worden. (Al ondersteunt Oracle Java Stored Procedures, dus java code direct in de database)
2 - Aangezien de logica centraal ligt, kan iedere connectie (dus ook in de db) er gebruik van maken.
3 - Om java (OO) te gebruiken, voor bv een simpel loopje, is een beetje overkill (naar mijn idee).
4 - Je kan echt niet alles met PL/SQL oplossen en komt een echte taal zoals C/java om de hoek kijken.
5 - Het is zo shitty om PL/SQL code te debuggen.

Al met al, kies de tool die het beste bij je probleem past.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

is pl een imperatieve taal of een logische taal?

en een van de nadelen aan een SQL is dat je oa geen functies kan maken en niet door een set heen kan ittereren. Problemen zoals:'haal de persoon op met de 1 na hoogste leeftijd' zijn lastig tot onmogelijk.

Maar ik vind het wel fijn om ermee te werken omdat ik op welke manier dan ook met data kan communiceren. Ik ben op dit moment bezig om sql te combineren met een logische taal die veel elementen uit prolog heeft. Hierdoor kan er transparant voor de knowledge engineer met database gegevens worden gewerkt.

  • 80000
  • Registratie: Januari 2002
  • Laatst online: 13-09 17:09

80000

mrox

Alarmnummer:
is pl een imperatieve taal of een logische taal?
Imperatief en de syntax lijkt sterk op Pascal.

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Op zaterdag 02 maart 2002 17:35 schreef Alarmnummer het volgende:
en een van de nadelen aan een SQL is dat je oa geen functies kan maken en niet door een set heen kan ittereren. Problemen zoals:'haal de persoon op met de 1 na hoogste leeftijd' zijn lastig tot onmogelijk.
Door een set ittereren kan met cursors, functies kunnen in 'echte' databases ook gemaakt worden en het leeftijd-probleem is natuurlijk met een simpele subquery ook opgelost. ;)

Maar, serieus, je moet sql (en uitbreidingen daarop) natuurlijk niet gaan vergelijken met andere talen (java/c/whatever). Ze hebben compleet verschillende toepassingsgebieden.

Today's subliminal thought is:


  • T-8one
  • Registratie: Oktober 2001
  • Laatst online: 01-09 11:45

T-8one

take it easy, take a sisi

Topicstarter
het is de bedoeling dat ik deze opdracht in pl/sql en sql maak, aan daarna een gui in developer. het is dus voor een oracle db en er wordt verwacht dat ik pl/sql als taal gebruik voor de database.

ik wil dus pnt geven aan de personen die de snelste tijd hebben (7 t/m 0). deze zwemmers zwemmen meerdere serie's (wedstrijden) en daar krijgen ze dus ook weer pnt voor en die wil ik dus bij elkaar op kunnen tellen (van dezelfde zwemmers dus) en later weer alle pnt van alle zwemmers van een zelfde school bij elkaar optellen (zodat er ook een lijst komt waarop de snelste scholen komen te staan)

het is dus de bedoeling dat ik een functie maak die pnt geeft aan de eerste 8 zwemmers en deze pnt opslaat in een tijdelijke tabel of als variable declareer zodat ik ze later weer bij elkaar op kan tellen.

(kan dit met rownum)?
(kan dit met een cursor)?

dit dus ff ter verduidelijking.

GP 32 the most powerfull handheld in the world :P


  • T-8one
  • Registratie: Oktober 2001
  • Laatst online: 01-09 11:45

T-8one

take it easy, take a sisi

Topicstarter
-->kick<---

GP 32 the most powerfull handheld in the world :P


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Als je een functie maakt welke per wedstrijd de punten ophaalt van een bepaalde zwemmer in een wedstrijd dan kun je vervolgens de punten sommeren in een eenvoudig sql statement.
De functie heeft dus 2 inputs, 1 output en bestaat uit een cursor waar 1 record uit gelezen wordt.
Nog een tipje erbij: de functie heeft een pragma restrict_references nodig om in het sql statement gebruikt te kunnen worden.

Who is John Galt?

Pagina: 1