2010-09-14 22 views
12

chicos. Aquí hay una matriz bidimensional de muestra simple en PL/SQL, que funciona perfectamente.¿Cómo inicializar manualmente una colección de GRABACIONES 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; 

Lo que tengo que hacer, es crear algo similar para una mesa de RECORDS. De esta manera:

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

La pregunta es, ¿puedo inicializar manualmente este tipo de matriz, o que se supone para ser llenado por bulk collects o similar? La misma sintaxis que arriba no parece funcionar, y no pude encontrar ninguna muestra de inicialización en los manuales.

Respuesta

14

No hay sintaxis "constructor" para los registros, así que hay que rellenar ellos de esta manera:

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

eso está muy mal. –

+0

Sí. Raramente he usado estructuras RECORD, aparte de las que están asociadas con una tabla o cursor usando% ROWTYPE y son útiles para FETCHing into. –

+0

hm, bueno, los utilizo cada vez que necesito un almacenamiento temporal de datos con una estructura de datos conocida, lo que hace que el código sea una especie de autocomentario. tal vez esa es una mala práctica. –

12

Esto funciona sin objetos, pero hay que declarar una función constructora para el tipo 'a' valores.

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

¡Encantador! Nota para cualquiera que reutilice esto, la definición de la función tiene que ser lo último en el bloque 'declare' (y el error de compilación que obtiene de otro modo es completamente inútil). –

+0

Además, si se encuentra con 'PLS-00222: no existe ninguna función con el nombre 'b' en este alcance', probablemente haya agregado' index by pls_integer 'a la definición de la tabla. Como lo hice :) Gracias @Shallow. –

Cuestiones relacionadas