2010-09-14 24 views
12

les gars. Voici un simple exemple de tableau bidimensionnel en PL/SQL, qui fonctionne parfaitement.Comment initialiser manuellement une collection de RECORD en PL/SQL?

declare 
    type a is table of number; 
    type b is table of a; 

    arr b := b(a(1, 2), a(3, 4)); 
begin 
    for i in arr.first .. arr.last loop 
    for j in arr(i).first .. arr(i).last loop 
     dbms_output.put_line(arr(i) (j)); 
    end loop; 
    end loop; 
end; 

Ce que je dois faire, est de créer quelque chose de similaire pour une table de RECORDS. Comme ceci:

type a is record(a1 number, a2 number); 
type b is table of a; 

La question est, puis-je initialiser manuellement ce type de tableau, ou il est censé être rempli par bulk collects ou similaire? La même syntaxe que ci-dessus ne semble pas fonctionner, et je n'ai pas pu trouver d'échantillon d'initialisation dans les manuels.

Répondre

14

Il n'y a pas de syntaxe « constructeur » pour RECORDS, donc vous devez les remplir comme ceci:

declare 
type a is record(a1 number, a2 number); 
type b is table of a; 
arr b := b(); 
begin 
arr.extend(2); 
arr(1).a1 := 1; 
arr(1).a2 := 2; 
arr(2).a1 := 3; 
arr(2).a2 := 4; 
end; 
+0

c'est dommage. –

+0

Oui. J'ai rarement utilisé les structures RECORD, à part celles qui sont associées à une table ou un curseur en utilisant% ROWTYPE et qui sont pratiques pour FETCHing. –

+0

hm, eh bien, je les utilise chaque fois que j'ai besoin d'un stockage de données temporaire avec une structure de données connue - cela fait du code une sorte d'auto-commentaire. c'est peut-être une mauvaise pratique. –

12

Cela fonctionne sans objets, mais vous devez déclarer une fonction constructeur pour le type « a » valeurs.

declare 
    type a is record(a1 number, a2 number); 
    type b is table of a; 

    arr b; 

    --Constructor for type a 
    function a_(a1 number, a2 number) return a is 
    r_a a; 
    begin 
    r_a.a1 := a1; 
    r_a.a2 := a2; 

    return(r_a); 
    end; 

begin 
    arr := b(a_(1, 2), a_(3, 4), a_(5, 6), a_(7, 8)); 

    for i in arr.first .. arr.last loop 
    dbms_output.put_line(arr(i).a1||', '||arr(i).a2); 
    end loop; 
end; 
+0

Charmant! Note à quiconque réutilise ceci, la définition de la fonction doit être la dernière chose dans le bloc 'declare' (et l'erreur de compilation que vous obtenez est complètement inutile). –

+0

De plus, si vous utilisez PLS-00222: aucune fonction avec le nom 'b' n'existe dans cette portée', vous avez probablement ajouté 'index by pls_integer 'à la définition de la table. Comme je l'ai fait :) Merci @Shallow. –