Oracle collections, records en table-types deel II
Geplaatst door Louis op 22 februari 2009In een eerdere bijdrage schreef ik over het gebruik van PL/SQL-records en ref cursoren.
Omdat ik binnenkort aan de slag mag voor een klant waarbij de opdracht luidt een procedure te schrijven die een geneste recordstructuur ontvangt en deze wegschrijft naar de diverse onderliggende tabellen, ben ik aan de slag gegaan om uit te zoeken hoe dit zou kunnen gaan in een voorbeeldsituatie
Ik heb de volgende opzet bedacht:
- We hebben een bedrijf dat meerdere adressen (vestigingen) heeft en uit meerdere afdelingen bestaat
- Een afdeling heeft meerdere werknemers
- Een werknemer heeft een adres.
De bedoeling is, dat de verwerkende programmatuur 1 object ontvangt waarin het bedrijf + de onderliggende gegevens aanwezig zijn, en deze gegevens weer afzonderlijk beschikbaar maakt voor verdere verwerking.
Het bedrijf Ywemacom import/export heeft 2 adressen; een hoofdadres en een nevenadres
Hoofdadres: Hoofdstraat 1, Amersfoort
Nevenadres: Nevenstraat 1, Amersfoort
Het bedrijf heeft 2 afdelingen, elk met 2 werknemers. Iedere werknemer heeft 1 adres
Afdeling 1 :Verkoop
Werknemer 1: Jan de Groot
Adresgegevens: Hugo de Grootstraat, te Utrecht
Werknemer 2: Karen Veenstra
Adresgegevens: Winkelstraat, te Amsterdam
Afdeling 2: Transploft
Werknemer 1: Joop Schroefstra
Adresgegevens: Stadsring, te Amersfoort
Werknemer 2: Henk Woudenberg
Adresgegevens: Vinkenhof, te Scherpenzeel
In dit voorbeeld worden deze gegevens in de eerste procedure in de package body, ‘VUL’ , in regels 38 – 64 aan het object bedrijf_rec toegevoegd.
Hierna wordt dit object in regel 67 aan de tweede procedure, ‘TOON’ als parameter meegegeven.
Deze procedure pluist het object uit-elkaar en toont de inhoud dmv DBMS_OUTPUT.PUT_LINE. In de praktijk zal in plaats hiervan een serie inserts in tabellen plaatsvinden.
De stored-package BEDRIJF:
CREATE OR REPLACE package bedrijf as
--
type adres_rec is record (straat varchar2(100)
,nummer number
,plaats varchar2(100)
,adrestype varchar2(100)
);
type adres_tab is table of adres_rec index by pls_integer;
--
type werknemer_rec is record (naam varchar2(100)
,adres adres_rec
);
type werknemer_tab is table of werknemer_rec index by pls_integer;
--
type afdeling_rec is record (naam varchar2(100)
, werknemer werknemer_tab
);
type afdeling_tab is table of afdeling_rec index by pls_integer;
--
type bedrijf_rec is record (naam varchar2(100)
, adres adres_tab
, afdeling afdeling_tab
);
--
procedure vul;
end bedrijf;
/
CREATE OR REPLACE package body bedrijf as
--
procedure toon (p_bedrijf bedrijf_rec);
--
procedure vul is
-- vul een bedrijfsrecord
--
l_bedrijf bedrijf_rec;
begin
l_bedrijf.naam := 'Ywemacom import/export'; -- record-type
l_bedrijf.adres(1).adrestype := 'Hoofdadres'; -- table-type
l_bedrijf.adres(1).straat := 'Hoofdstraat';
l_bedrijf.adres(1).nummer :=1;
l_bedrijf.adres(1).plaats := 'Amersfoort';
l_bedrijf.adres(2).adrestype := 'Nevenadres';
l_bedrijf.adres(2).straat := 'Nevenstraat';
l_bedrijf.adres(2).nummer :=1;
l_bedrijf.adres(2).plaats := 'Amersfoort';
l_bedrijf.afdeling(1).naam := 'Verkoop';
l_bedrijf.afdeling(1).werknemer(1).naam := 'Jan de Groot';
l_bedrijf.afdeling(1).werknemer(1).adres.straat := 'Hugo de Grootstraat';
l_bedrijf.afdeling(1).werknemer(1).adres.nummer := 1;
l_bedrijf.afdeling(1).werknemer(1).adres.plaats := 'Utrecht';
l_bedrijf.afdeling(1).werknemer(2).naam := 'Karen Veenstra';
l_bedrijf.afdeling(1).werknemer(2).adres.straat := 'Winkelstraat';
l_bedrijf.afdeling(1).werknemer(2).adres.nummer := 2;
l_bedrijf.afdeling(1).werknemer(2).adres.plaats := 'Amsterdam';
l_bedrijf.afdeling(2).naam := 'Transploft';
l_bedrijf.afdeling(2).werknemer(1).naam := 'Joop Schroefstra';
l_bedrijf.afdeling(2).werknemer(1).adres.straat := 'Stadsring';
l_bedrijf.afdeling(2).werknemer(1).adres.nummer := 15;
l_bedrijf.afdeling(2).werknemer(1).adres.plaats := 'Amersfoort';
l_bedrijf.afdeling(2).werknemer(2).naam := 'Henk Woudenberg';
l_bedrijf.afdeling(2).werknemer(2).adres.straat := 'Vinkenhof';
l_bedrijf.afdeling(2).werknemer(2).adres.nummer := 78;
l_bedrijf.afdeling(2).werknemer(2).adres.plaats := 'Scherpenzeel';
--
-- roep de procedure aan met het bedrijfs-object als parameter
toon(p_bedrijf => l_bedrijf);
end vul;
--
procedure toon (p_bedrijf bedrijf_rec) is
-- pluis het bedrijfs-object uit en druk de inhoud af
l_bedrijf bedrijf_rec;
begin
l_bedrijf := p_bedrijf;
--
dbms_output.put_line ('Bedrijf: '||l_bedrijf.naam); -- 1 bedrijf
dbms_output.put_line ('Adresgegevens: ');
for bedrijfsadressen in l_bedrijf.adres.first..l_bedrijf.adres.last loop
dbms_output.put_line (l_bedrijf.adres(bedrijfsadressen).adrestype||': '||l_bedrijf.adres(bedrijfsadressen).straat||' '
||l_bedrijf.adres(bedrijfsadressen).nummer||' te '
||l_bedrijf.adres(bedrijfsadressen).plaats);
end loop;
-- afdelingen af
for afdelingen in l_bedrijf.afdeling.first ..l_bedrijf.afdeling.last loop
dbms_output.put_line ('Afdeling '||afdelingen||' is: '||l_bedrijf.afdeling(afdelingen).naam);
-- werknemers af
for werknemers in l_bedrijf.afdeling(afdelingen).werknemer.first..l_bedrijf.afdeling(afdelingen).werknemer.last loop
dbms_output.put_line('Werknemer '||werknemers|| ' is: '||l_bedrijf.afdeling(afdelingen).werknemer(werknemers).naam);
-- bijbehorende adresgegevens
dbms_output.put_line('Adresgegevens: '||l_bedrijf.afdeling(afdelingen).werknemer(werknemers).adres.straat||' '
||l_bedrijf.afdeling(afdelingen).werknemer(werknemers).adres.nummer||' te '
||l_bedrijf.afdeling(afdelingen).werknemer(werknemers).adres.plaats);
end loop;
end loop;
end toon;
--
end bedrijf;
/
Aanroep in sql*plus en het resultaat
SQL> set serveroutput on SQL> begin 2 bedrijf.vul; 3 end; 4 /
Bedrijf: Ywemacom import/export
Adresgegevens:
Hoofdadres: Hoofdstraat 1 te Amersfoort
Nevenadres: Nevenstraat 1 te Amersfoort
Afdeling 1 is: Verkoop
Werknemer 1 is: Jan de Groot
Adresgegevens: Hugo de Grootstraat 1 te Utrecht
Werknemer 2 is: Karen Veenstra
Adresgegevens: Winkelstraat 2 te Amsterdam
Afdeling 2 is: Transploft
Werknemer 1 is: Joop Schroefstra
Adresgegevens: Stadsring 15 te Amersfoort
Werknemer 2 is: Henk Woudenberg
Adresgegevens: Vinkenhof 78 te Scherpenzeel
PL/SQL procedure successfully completed.
SQL>
Bijdrage afdrukken
Opgeslagen onder: oracle, programmeren
Reageer »
Eerlijk gezegd zou ik erg graag eerder met dit 

Ik dacht dat ik het vak van PL/SQL-programma’s schrijven nu toch wel aardig onder de knie had, maar het blijkt toch dat je nooit te oud bent om te leren.
Vandaag ben ik in de AmsterdamArena geweest bij de Quest Nederlandse Toad Gebruikersdag. Naast de kennismaking met de laatste versie van
Sinds de installatie van 
Recente reacties