Professional Documents
Culture Documents
SamenvattingHoofdstuk4 Vervolg Collections 2015
SamenvattingHoofdstuk4 Vervolg Collections 2015
57
Vb1:
CREATE TYPE type_nested_mnr
IS TABLE OF NUMBER;
CREATE OR REPLACE PROCEDURE vb_nested_table
IS
t_med
type_nested_mnr;
BEGIN
SELECT mnr BULK COLLECT INTO t_med
FROM medewerkers
WHERE afd=10
ORDER BY gbdatum ASC;
FOR i IN 1..t_med.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE(t_med(i));
END LOOP;
END vb_nested_table;
Vb2
CREATE TYPE type_varray_mnr
IS VARRAY (3) OF NUMBER;
CREATE OR REPLACE PROCEDURE vb_varray
AS
t_med type_varray_mnr;
BEGIN
SELECT mnr BULK COLLECT INTO t_med
FROM medewerkers
WHERE afd=30
ORDER BY gbdatum DESC;
FOR i IN 1..t_med.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE (t_med(i));
END LOOP;
END vb_varray;
geeft een ERROR omdat de varray slechts 3 elementen kan bevatten en er meer dan 3
medewerkers in afdeling 30 zitten
Het initialiseren van een varray of een nested tabel via het toekenningsteken is complexer dan bij
associatieve arrays.
Vb 3
Stored Procedures
58
Collections en DML
Hoe kunnen collections ingezet worden bij het doorvoeren van wijzigingen in de tabellen van de
database?
En van de beperkingen van SQL is dat rijen uit een tabel door een SELECT of een
DML instructie steeds in willekeurige volgorde zullen uitgevoerd worden.
De vraag, geef de 10 oudste medewerkers een loonsverhoging van 10% kan binnen
SQL niet opgelost worden omdat bij deze update de volgorde van de rijen een rol speelt.
We lossen dit probleem op gebruik makend van collections (of cursors zie verder).
CREATE OR REPLACE PROCEDURE vb_rij_per_rij_verwerking
AS
TYPE type_coll_med
IS TABLE OF medewerkers.mnr%TYPE;
t_med type_coll_med;
BEGIN
SELECT mnr BULK COLLECT INTO t_med
FROM medewerkers
ORDER BY gbdatum ASC
we sorteren van oud naar jong
FOR UPDATE;
FOR i IN 1..10
we nemen er de 10 eersten uit
LOOP
UPDATE medewerkers
SET maandsal=maandsal*1.1
WHERE mnr=t_med(i);
END LOOP;
COMMIT;
END vb_rij_per_rij_verwerking;
Bemerking: we veronderstellen hierbij dat alle medewerkers een verschillende leeftijd hebben.
Als er medewerkers zijn met eenzelfde leeftijd, wordt de oplossing complexer!
Stored Procedures
59
Probleem:
Een PL/SQL programma bevat PL statements en SQL statements. Om deze statements te kunnen
verwerken zijn er 2 soorten ENGINES nodig (n voor de PL statements en n voor de SQL
statements). Omdat in een PL/SQL programma beide soorten statements aanwezig zijn moet er
regelmatig van engine gewisseld worden.
Dit noemt men contextswitches. Ze wegen op de performantie.
Om het aantal contextswitches drastisch te verlagen kan gebruik gemaakt worden van het BULK
DML mechanisme.
60
Voorbeeld:
Medewerkers die als chef 7566,7698,of 1 hebben krijgen een salarisverhoging.
CREATE OR REPLACE PROCEDURE salarisverhoging
AS
TYPE type_tab_chef IS TABLE OF medewerkers.chef%TYPE
INDEX BY PLS_INTEGER;
t_chef type_tab_chef;
BEGIN
t_chef(1):=7566;
t_chef(2):=7698;
t_chef(3):=1;
FORALL i IN INDICES OF t_chef
UPDATE medewerkers
SET maandsal=maandsal*1.05
WHERE chef=t_chef(i);
FOR i IN 1..t_chef.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE('aantal verwerkte rijen voor '||t_chef(i)||' '||SQL
%BULK_ROWCOUNT(i));
END LOOP;
END;
Programma geeft hier als output:
aantal verwerkte rijen voor 7566 2
aantal verwerkte rijen voor 7698 5
aantal verwerkte rijen voor 1 0
2. Oefeningen op de cursussendatabase
Probeer eerst alle voorbeelden van de samenvatting uit !
Vraag 1
Maak een kopie van de tabel CURSUSSEN en noem deze tabel CURSUSSEN_BU.
De tabel CURSUSSEN_BU moet leeg zijn!
Schrijf nu een procedure die de inhoud van de tabel CURSUSSEN met een bulk operatie in een
collection variabele plaatst en daarna de inhoud van de collection variabele via bulk DML naar
de tabel CURSUSSEN_BU schrijft.
Vraag 2
Plaats cursus en begindatum van uitvoeringen waarvoor meer dan 4 inschrijvingen zijn in een
collection variabele. Gebruik deze lijst om in de tabel UITVOERINGEN de LOCATIE voor deze
cursusuitvoeringen te wijzigen in ANTWERPEN. Gebruik het bulk DML mechanisme.
Stored Procedures
61
Stored Procedures
62
3 Theorievragen
1.
2.
3.
4.
Welke essentile verschillen bestaan er tussen associatieve arrays, nested tables en varrays?
Waarom gebruik je voor collections die genitialiseerd moeten worden via het
toekenningsteken (:=) best een associatieve array?
Wat is het voordeel van een SELECT BULK COLLECT INTO?
Leg uit waarom BULK DML leidt tot performantieverbetering!
4 Projectopgaven
Zie BB stored procedures Lesmateriaal Lesweek1 Project 2
Stored Procedures
63