2012-02-06 159 views
16

¿Puede ayudarme cómo puedo crear una matriz bidimensional en PL/SQL para el Procedimiento almacenado? Las columnas son dinámicas, por lo que pueden crecer y cambiar también en tipos. Se agradece cualquier ayuda. ¡Gracias de antemano!Crear o simular matrices bidimensionales en PL/SQL

Tengo el siguiente código:

Type CAR_TABLE_ARRAY is varray(2) of varchar2(255); 
TYPE CAR_TABLE_TYPE IS TABLE OF CAR_TABLE_ARRAY; 
CAR_TABLE CAR_TABLE_TYPE; 

CAR_TABLE := CAR_TABLE_TYPE(); 
CAR_TABLE.EXTEND(10); 
CAR_TABLE(1)(1) := 'DODGE'; 
CAR_TABLE(2)(1) := 'FORD'; 
CAR_TABLE(3)(1) := 'MUSTANG'; 
CAR_TABLE(4)(1) := 'EDSEL'; 
CAR_TABLE(5)(1) := 'STUDEBAKER'; 

DBMS_OUTPUT.put_line('1 ' || CAR_TABLE(1)(1)); 
DBMS_OUTPUT.put_line('2 ' || CAR_TABLE(2)(1)); 
DBMS_OUTPUT.put_line('3 ' || CAR_TABLE(3)(1)); 
DBMS_OUTPUT.put_line('4 ' || CAR_TABLE(4)(1)); 
DBMS_OUTPUT.put_line('5 ' || CAR_TABLE(5)(1)); 

Cuando corro me sale el siguiente error:

ORA-06531: Reference to uninitialized collection

+0

Una matriz de dos dimensiones matemáticamente es solo una asignación (X, Y) -> VALOR. Entonces, ¿qué tal crear una tabla temporal con 3 columnas: X, Y, VALOR en PL/SQL? –

+0

hola BycycleDude, gracias por su respuesta. Sin embargo, no puedo crear una tabla temporal, porque creo que las columnas deben ser dinámicas para que pueda cambiar sus tipos de columnas y el número de columnas. – Jemru

+0

Fácil, solo cree una columna 'TYPE' y cree numerosas columnas' VALUE' con nulos y configure solo la que necesita: X, Y, TYPE, VALOR_FLOAT, VALUE_STRING, VALUE_TIMESTAMP, VALUE_BLOB, ... –

Respuesta

19

He aquí un ejemplo del uso de una matriz multidimensional en PL/SQL. Aquí utilizo una matriz que contiene una matriz.

declare 

    type t_features is table of varchar(100) index by pls_integer; 
    type t_car_rec is record 
    (
    make varchar2(50), 
    model varchar2(50), 
    features t_features 
); 

    type t_car_tab is table of t_car_rec index by pls_integer; 
    car_tab t_car_tab; 

    procedure show_detail is 
    car_idx pls_integer; 
    features_idx pls_integer; 
    begin 
    car_idx := car_tab.first; 
    loop 
     exit when car_idx is null; 
     dbms_output.put_line('Details for ' || car_tab(car_idx).make || ' ' || car_tab(car_idx).model); 

     features_idx := car_tab(car_idx).features.first; 
     loop 
     exit when features_idx is null; 
     dbms_output.put_line(' =>' || car_tab(car_idx).features(features_idx)); 

     features_idx := car_tab(car_idx).features.next(features_idx); 
     end loop; 

     car_idx := car_tab.next(car_idx); 
    end loop; 
    end; 

begin 

    -- using sequential index values 
    car_tab(1).make := 'Ferrari'; 
    car_tab(1).model := 'Testarossa'; 
    car_tab(1).features(1) := 'Fast'; 
    car_tab(1).features(2) := 'Looks cool'; 
    car_tab(1).features(3) := 'Expensive'; 

    -- using random index values (sparse) 
    car_tab(2).make := 'Acura'; 
    car_tab(2).model := 'TSX'; 
    car_tab(2).features(14) := 'Small'; 
    car_tab(2).features(200) := 'Good MPG'; 
    car_tab(2).features(36) := 'Inexpensive'; 

    show_detail; 

end; 

salida sería:

Details for Ferrari Testarossa 
    =>Fast 
    =>Looks cool 
    =>Expensive 
Details for Acura TSX 
    =>Small 
    =>Inexpensive 
    =>Good MPG 

Espero que ayude

3

Esto se debe a que está haciendo referencia a los arreglos internos que no se inicializan. De cualquier
añadir algo como:

CAR_TABLE(1) := CAR_TABLE_ARRAY(); 
CAR_TABLE(1).EXTEND(1); 
CAR_TABLE(2) := CAR_TABLE_ARRAY(); 
CAR_TABLE(2).EXTEND(1); 
... 

O hacer los arreglos interiores (CAR_TABLE_ARRAY) como matrices asociative:

Type CAR_TABLE_ARRAY is TABLE of varchar2(255) index by binary_integer; 
6

VARRAY y tipos de datos definidos por el usuario de tabla anidadas siempre tienen que ser inicializado usando un constructor. Lo está haciendo correctamente para la tabla anidada, pero no para los VARRAY que contiene. La solución más simple es llamar al constructor en las líneas de asignación:

declare 
    Type CAR_TABLE_ARRAY is varray(2) of varchar2(255); 
    TYPE CAR_TABLE_TYPE IS TABLE OF CAR_TABLE_ARRAY; 
    CAR_TABLE CAR_TABLE_TYPE; 
begin  
    CAR_TABLE := CAR_TABLE_TYPE(); 
    CAR_TABLE.EXTEND(10); 
    CAR_TABLE(1) := CAR_TABLE_ARRAY('DODGE',null); 
    CAR_TABLE(2) := CAR_TABLE_ARRAY('FORD',null); 
    CAR_TABLE(3) := CAR_TABLE_ARRAY('MUSTANG',null); 
    CAR_TABLE(4) := CAR_TABLE_ARRAY('EDSEL',null); 
    CAR_TABLE(5) := CAR_TABLE_ARRAY('STUDEBAKER',null); 

    DBMS_OUTPUT.put_line('1 ' || CAR_TABLE(1)(1)); 
    DBMS_OUTPUT.put_line('2 ' || CAR_TABLE(2)(1)); 
    DBMS_OUTPUT.put_line('3 ' || CAR_TABLE(3)(1)); 
    DBMS_OUTPUT.put_line('4 ' || CAR_TABLE(4)(1)); 
    DBMS_OUTPUT.put_line('5 ' || CAR_TABLE(5)(1)); 
end; 
Cuestiones relacionadas