Toon posts:

[PL/SQL]array gebruiken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben druk met een package te maken in PL/SQL.

Nu gebruik ik een procedure die een andere procedure meerdere malen aanroept, maar steeds met verschillende params.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   PROCEDURE invullen(
      p_afkorting     IN   VARCHAR2
     ,p_descr         IN   VARCHAR2
  )
   IS
   BEGIN

      INSERT INTO [...]

   END invullen;

   PROCEDURE start()
   IS
   BEGIN
     invullen('a', 'Omschrijving a');
     invullen('b', 'Omschrijving b');
     invullen('c', 'Omschrijving c');
   END start;


Nu wil ik het aanroepen van de tweede functie graag doen vanuit een array of lijst.
Ik heb er al aan gedacht om een tijdelijke tabel te gebruiken, maar ik wil liever niet de database uitbreiden.

Ik dacht iets te doen met VARRAY, maar dat krijg ik niet voor elkaar. Ik kan er wel wat invullen (alleen de afkorting, niet de omschrijving) maar ik snap niet hoe ik er door heen moet lopen.

De array wil ik voor meerdere functies in dezelfde package gebruiken.
pseudo-code:
code:
1
2
3
4
  fillArray;
  for lbound(g_arrAfkortingen) to ubound(g_arrAfkortingen)
    invullen(g_arrAfkortingen[0], g_arrAfkortingen[1]);
  next


Wat is de beste manier om dit in PL/SQL code op te lossen?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Dat kan op vele manieren, zie: http://download.oracle.co...02/b14261/collections.htm

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
declare
type record_rec is record (afk varchar2(1), oms varchar2(100));
type table_tab is table of record_rec index by binary_integer;
t_invullen table_tab;
begin
t_invullen(1).afk := 'a';
t_invullen(1).oms := 'Omschrijving a';
t_invullen(2).afk := 'b';
t_invullen(2).oms := 'Omschrijving b';
t_invullen(3).afk := 'c';
t_invullen(3).oms := 'Omschrijving c';

for i in t_invullen.first..t_invullen.last
loop
  invullen (t_invullen(i).afk, t_invullen(i).omschrijving);
end loop;
end;

Who is John Galt?


  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Verwijderd schreef op donderdag 19 februari 2009 @ 12:25:
Ik ben druk met een package te maken in PL/SQL.

Nu gebruik ik een procedure die een andere procedure meerdere malen aanroept, maar steeds met verschillende params.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   PROCEDURE invullen(
      p_afkorting     IN   VARCHAR2
     ,p_descr         IN   VARCHAR2
  )
   IS
   BEGIN

      INSERT INTO [...]

   END invullen;

   PROCEDURE start()
   IS
   BEGIN
     invullen('a', 'Omschrijving a');
     invullen('b', 'Omschrijving b');
     invullen('c', 'Omschrijving c');
   END start;


Nu wil ik het aanroepen van de tweede functie graag doen vanuit een array of lijst.
Ik heb er al aan gedacht om een tijdelijke tabel te gebruiken, maar ik wil liever niet de database uitbreiden.

Ik dacht iets te doen met VARRAY, maar dat krijg ik niet voor elkaar. Ik kan er wel wat invullen (alleen de afkorting, niet de omschrijving) maar ik snap niet hoe ik er door heen moet lopen.

De array wil ik voor meerdere functies in dezelfde package gebruiken.
pseudo-code:
code:
1
2
3
4
  fillArray;
  for lbound(g_arrAfkortingen) to ubound(g_arrAfkortingen)
    invullen(g_arrAfkortingen[0], g_arrAfkortingen[1]);
  next


Wat is de beste manier om dit in PL/SQL code op te lossen?
In de code hieronder ga ik ervanuit dat:
1) Je VARRAY zowel de korte als de lange omschrijving bevat (wat overigens een lelijke oplossing is, gebruik een VARRAY met daarin een record
2) De VARRAY een lengte van 10 heeft (dus feitelijk 5x entries heeft)

code:
1
2
3
FOR i IN 1..5 LOOP
   invullen(g_arrAfkortingen(2*i -1), g_arrAfkortingen(2*i));
END;


Gebruik van een record is echter makkelijker, want dan kan je gewoon een for-each loop gebruiken en de individuele velden van het record aanspreken. BTW: De Oracle PL/SQL Reference is gratis beschikbaar op oracle.com

Verwijderd

Topicstarter
Allen bedankt voor de info.
Ik gebruik nu het voorbeeld van justmental en het werkt precies zoals ik bedoelde.

Ik had wel al tijdens het zoeken wat gezien over het table type, maar niet echt begrepen hoe het werkte. Nu wel.

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Verwijderd schreef op donderdag 19 februari 2009 @ 15:48:
Allen bedankt voor de info.
Ik gebruik nu het voorbeeld van justmental en het werkt precies zoals ik bedoelde.

Ik had wel al tijdens het zoeken wat gezien over het table type, maar niet echt begrepen hoe het werkte. Nu wel.
De 'Oracle PL/SQL Reference' (hoewel soms een beetje kort door de bocht) is een goed startpunt om daar meer over te leren.