web-dev-qa-db-fra.com

Création ou simulation de tableaux bidimensionnels en PL / SQL

Pouvez-vous m'aider à créer un tableau bidimensionnel en PL/SQL pour la procédure stockée? Les colonnes sont dynamiques de sorte qu'elles peuvent croître et changer de types également. Toute aide est appréciée. Merci d'avance!

J'ai le code suivant:

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) );

Lorsque je cours, j'obtiens l'erreur suivante:

ORA-06531: référence à une collection non initialisée

17
Jemru

Voici un exemple d'utilisation d'un tableau multidimensionnel en pl/sql. Ici, j'utilise un tableau contenant un tableau.

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;

La sortie serait:

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

J'espère que cela pourra aider

20
tbone

Les types de données définis par l'utilisateur VARRAY et les tables imbriquées doivent toujours être initialisés à l'aide d'un constructeur. Vous faites cela correctement pour la table imbriquée, mais pas pour les VARRAY qu'elle contient. La solution la plus simple consiste à appeler le constructeur dans les lignes d'affectation:

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;
8
Allan

C'est parce que vous faites référence aux tableaux internes qui ne sont pas initialisés.
Soit ajoutez quelque chose comme:

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

Ou créez les tableaux internes (CAR_TABLE_ARRAY) en tant que tableaux associatifs:

Type CAR_TABLE_ARRAY is TABLE of varchar2(255) index by binary_integer;
5
A.B.Cade