[G_PRO] Databanken
  • Welkom
  • Inleiding
    • Benodigdheden
    • Nuttige extra's
    • Mee helpen?
  • Semester 1: databanken intro
    • Installatie van alle software
    • Databanken
      • Inleiding
      • Voorbeeld
      • Wat is een relationele databank
      • Basisstructuren van een relationele databank
      • Diagramnotatie
    • (My)SQL
      • DDL
        • Datatypes
          • Enum
        • CREATE
        • ALTER
        • DROP
        • Sleutels voor identificatie
        • Primaire sleutel toevoegen/verwijderen
        • Primaire sleutel in een nieuwe tabel
        • Vreemde sleutels
        • Relaties-voorstellen
        • Labo
      • DML
        • INSERT
        • UPDATE
        • DELETE
        • LIKE
        • Logische operatoren
        • Vergelijkingen
        • SELECT sorteren
        • Functies
        • Labo
      • SELECT
        • SELECT met clausules
        • SELECT met WHERE
      • Groeperen en samenvatten
        • Aggregaatfuncties
        • SELECT met GROUP BY
        • SELECT met HAVING
        • IN
        • BETWEEN
        • SELECT DISTINCT
        • Labo
      • JOINS
        • JOINs bij simpele relaties
        • JOINs via tussenliggende tabel
        • UPDATE van JOIN
      • apTunes project
  • PRO (GEEN LEERSTOF EN/OF IN OPBOUW)
    • PRO
      • Waarom een databank?
      • Een databank ontwerpen
      • ERM
        • Basisbegrippen
        • Constraints (voorwaarden, beperkingen)
        • Keys (Sleutels)
        • Discussiepunten bij ontwerp in ERM
        • Aanvullende begrippen
        • Herleiden van ERD's tot tabellen
        • Voorbeeld
        • Bibliografie
        • Labo oefeningen
      • NoSQL
      • Blockchain
  • SEMESTER 2: DATABANKEN
    • Join
      • INNER JOIN
      • LEFT JOIN
      • COALESCE
      • RIGHT JOIN
      • LEFT EXCLUDING JOIN
      • RIGHT EXCLUDING JOIN
      • OUTER JOIN
      • OUTER EXCLUDING JOIN
      • Samenvattende flowchart
      • Labo oefeningen
    • Views
      • CREATE
      • ALTER
      • DROP
      • UPDATE
      • RENAME
      • BESLUIT
      • Labo oefeningen
    • Subqueries
      • Een onafhankelijke subquery
      • Subqueries met tijdelijke opslag
      • Labo oefeningen
    • Indexeren
      • mogelijkheden
      • CREATE
      • DROP
      • UNIQUE
      • trage queries opvolgen
    • ERD
      • Referentiële beperkingen
      • Overzicht
      • Labo oefeningen
    • Stored programs
      • Stored procedures
      • CREATE
      • DROP
      • DELIMITER
      • Variabelen
      • Parameters
      • Gerelateerde data invoegen
      • IF -THEN-ELSE-ELSEIF
      • LOOP
      • WHILE
      • REPEAT
      • SIGNAL
      • Error handling
      • RESIGNAL
      • Stored functies
      • Triggers
      • Cursors
      • Transacties en rollbacks
      • Object access control
      • Oefeningen basisgebruik stored procedures
      • Oefeningen control flow
      • Oefeningen stored functions
      • Oefeningen triggers
      • Oefeningen error handling
      • Oefeningen transacties en access control
Powered by GitBook
On this page
  • Extra info
  • Vraag 1
  • Vraag 2
  • Vraag 3
  • Vraag 4

Was this helpful?

Export as PDF
  1. SEMESTER 2: DATABANKEN
  2. Stored programs

Oefeningen control flow

We werken verder met de aptunes-database. Activeer deze database in elk script. Gebruik telkens het meest specifieke parametertype dat je kan toepassen. Gebruik dus geen INOUT parameters als het ook met een gewone IN of OUT parameter kan.

Extra info

We zullen gebruik maken van stored procedures om testdata te genereren. In het Engels wordt hier vaak over "mock data" gesproken. Dit is erg nuttig om te experimenteren met een database. Het is ook wat wij als lectoren doen om een grote database zoals aptunes op te vullen.

Deze data hoeft geen steek te houden, maar ze moet voldoende gevarieerd zijn. Daarom voeren we willekeurige waarden in. Met de functie RAND() kan je een willekeurig getal tussen 0 en 1 genereren. Exact 0 kan gegenereerd worden, maar exact 1 niet.

Wil je een getal tussen 0 en een andere waarde (bijvoorbeeld ANDER_GETAL) genereren, dan schrijf je: FLOOR(RAND() * ANDER_GETAL);. FLOOR dient om naar beneden af te ronden, zodat je een INT verkrijgt. ANDER_GETAL kan dan nooit gegenereerd worden. Wil je een getal tussen 1 en ANDER_GETAL genereren, dan tel je er gewoon 1 bij: FLOOR(RAND() * ANDER_GETAL) + 1.

Vraag 1

Bekijk de tabel Albumreleases. Je zal merken dat deze nog leeg is. We zouden deze graag opvullen met geldige waarden. Deze hoeven niet overeen te stemmen met de werkelijkheid, maar de tabel bevat foreign key kolommen dus we mogen er enkel waarden in plaatsen die ergens anders een primary key vormen.

We zullen hier gebruik maken van het feit dat onze primary keys getallen zijn van 1 tot het aantal records in een gegeven tabel.

Schrijf een stored procedure,MockAlbumRelease, die een nieuwe albumrelease zal toevoegen. Deze werkt als volgt:

  1. Ze declareert vier variabelen van type INT: numberOfAlbums, numberOfBands, randomAlbumId en randomBandId. De initiële waarde hiervan is 0.

  2. Ze past numberOfAlbums aan naar het aantal albums in je systeem en numberOfBands naar het aantal bands.

  3. Ze past randomAlbumId aan naar een willekeurige getal tussen 1 en het aantal albums en past randomBandId aan naar een willekeurig getal tussen 1 en het aantal bands.

  4. Als (randomAlbumId,randomBandId) nog niet voorkomt in de tabel Albumreleases, voegt ze deze combinatie toe door middel van een INSERT. Je moet hier zelf gebruik maken van een IF, een IN en een subquery (op Albumreleases) om te beslissen of de insert mag plaatsvinden. Je hoeft niets te doen als de release al bestaat.

Plaats enkel de definitie in het script, geen oproep. Noem het script dat voor de definitie zorgt 0644__Oefening.sql. Test je procedure uit door ze enkele keren op te roepen en dan Albumreleases te bekijken. Na calibratie was deze tabel leeg, dus na enkele calls zouden er een paar records moeten staan.

Vraag 2

Het nadeel van onze stored procedure uit vraag 1 is dat we combinaties kunnen genereren die al aanwezig zijn. Dan gebeurt er niets. Als we een exact aantal mock releases willen toevoegen, is dat erg vervelend.

Kopieer je definitie uit de vorige oefening en noem de stored procedure ditmaal MockAlbumReleaseWithSuccess. Voorzie ze van een output parameter met naam success van type BOOL. Zet deze op 1 als de INSERT plaatsvindt en zet anders op 0.

Plaats enkel de definitie in het script, geen oproep. Noem het script dat voor de definitie zorgt 0645__Oefening.sql.

Vraag 3

Schrijf een stored procedure, MockAlbumReleases. Deze zal in één keer een heleboel testdata toevoegen aan het systeem. Dit gaat als volgt:

  1. Definieer de stored procedure met één input parameter, extraReleases van type INT.

  2. Declareer een variabele counter van type INT met startwaarde 0.

  3. Schrijf een REPEAT waarin MockAlbumReleaseWithSuccess wordt opgeroepen en waarbij de teller wordt verhoogd als er nieuwe data is toegevoegd.

  4. Zorg ervoor dat de lus eindigt wanneer het gewenste aantal releases is toegevoegd. Dus CALL MockAlbumReleases(20) stopt nadat er 20 nieuwe releases zijn toegevoegd.

Deze stored procedure zou in een oneindige lus terecht komen als je ze zou oproepen wanneer je al beschikt over alle mogelijke combinaties. Ze zou ook heel traag worden als je beschikt over bijna alle combinaties. Dat negeren we voorlopig, want er zijn echt wel enorm veel mogelijke combinaties.

Plaats enkel de definitie in het script, geen oproep. Noem het script dat voor de definitie zorgt 0646__Oefening.sql.

Vraag 4

Herschrijf MockAlbumReleases tot MockAlbumReleasesLoop, waarin gebruik gemaakt wordt van een LOOP in plaats van een REPEAT. Voor de rest doet de stored procedure net hetzelfde als de vorige versie.

Plaats enkel de definitie in het script, geen oproep. Noem het script dat voor de definitie zorgt 0647__Oefening.sql.

PreviousOefeningen basisgebruik stored proceduresNextOefeningen stored functions

Last updated 3 years ago

Was this helpful?