2010-09-14 13 views
12

ragazzi. Ecco un semplice array di campioni bidimensionale in PL/SQL, che funziona perfettamente.Come inizializzare manualmente una raccolta di RECORD in 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; 

Cosa devo fare, è quello di creare qualcosa di simile per una tabella di RECORDS. Come questo:

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

la domanda è: posso inizializzare manualmente questo tipo di matrice, o dovrebbe essere riempito da bulk collects o simili? La stessa sintassi di cui sopra non sembra funzionare e non sono riuscito a trovare alcun esempio di inizializzazione nei manuali.

risposta

14

Non v'è alcuna sintassi "costruttore" per i record, in modo da avere a popolare di loro in questo modo:

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

questo è troppo male. –

+0

Sì. Raramente ho avuto alcun uso per le strutture RECORD, a parte quelle che sono associate a una tabella o cursore usando% ROWTYPE e sono utili per FETCHing in. –

+0

hm, beh, li uso ogni volta che ho bisogno di un'archiviazione temporanea dei dati con una struttura dati nota - questo rende il codice una sorta di auto-commento. forse è una cattiva pratica –

12

Questo funziona senza oggetti, ma si deve dichiarare una funzione di costruzione per tipo di valori 'A'.

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

Bello! Nota a chiunque lo riutilizzi, la definizione della funzione deve essere l'ultima cosa nel blocco 'declare' (e l'errore di compilazione che ottieni altrimenti è completamente inutile). –

+0

Inoltre, se si esegue 'PLS-00222: nessuna funzione con nome 'b' esiste in questo ambito', probabilmente si è aggiunto' indice di pls_integer 'alla definizione della tabella. Come ho fatto :) Grazie @Shallow. –

Problemi correlati