2009-06-18 6 views
0

J'ai un script qui utilise plusieurs fois VARRAY. Mais, je n'arrive pas à comprendre comment réinitialiser le VARRAY après l'avoir bouclé une fois. J'ai écrit le script de base suivant pour m'aider à dépanner:Comment remplir plusieurs fois la variable varray

DECLARE 
    TYPE multi_show_id_type IS VARRAY (60) OF VARCHAR2 (10); 

    multi_show_id multi_show_id_type := multi_show_id_type(); 
    counter  NUMBER := 1; 
    i    NUMBER := 1; 
BEGIN 
    DBMS_OUTPUT.put_line ('BEGIN'); 

    WHILE i < 10 
    LOOP 
     DBMS_OUTPUT.put_line (i); 
     --counter:=0; 
     --multi_show_id :=multi_show_id_type(); 
     --multi_show_id.delete; 

     WHILE counter < 25 
     LOOP 
     multi_show_id.EXTEND(); 
     multi_show_id (counter) := counter * counter; 
     DBMS_OUTPUT.put_line ('VArray: [' || counter || '] [' || multi_show_id (counter) || ']'); 

     counter := counter + 1; 
     END LOOP; 
     i := i + 1; 
    END LOOP; 

    DBMS_OUTPUT.put_line ('END'); 
END; 
/

Ce script fonctionne lorsqu'il ne fait qu'une boucle sur le tableau. Mais si vous décommentez la ligne counter:=0, ce qui l'oblige à boucler 10 fois la boucle de population du tableau, j'obtiens une erreur ORA-06532. Vous pouvez voir certaines des choses que j'ai essayées dans les autres lignes commentées. Toute aide serait appréciée.

Répondre

0

Il semble y avoir deux problèmes ici. d'abord, l'index VARRAY commence à 1. seconde, vous vous arrêterez une fois que votre VARRAY est plein à 60 points, tel que défini dans votre déclaration.

utiliser les éléments suivants:

TYPE multi_show_id_type IS VARRAY (250) OF VARCHAR2 (10);

et

counter:=1;

décommenter la ligne multi_show_id :=multi_show_id_type(); si vous voulez commencer à 1 pour chaque boucle. Si vous voulez vous assurer que pas plus de 4 valeurs, votre boucle while interne devrait faire cette restriction.

+0

Comment Est-ce que cela résout mon problème? Je veux que le varray redémarre à 1 chaque boucle. Pour mon programme actuel, pas plus de 4 valeurs seront stockées dans le tableau, et généralement un seul. –

1

En fait, @akf est correct; votre code tel qu'il est écrit ne fonctionnera pas car un VARRAY commence à l'item 1, pas à zéro.

Changer votre code thusly et il fonctionne:

... 
    LOOP 
      DBMS_OUTPUT.put_line (i); 
      counter:=1; 
      --multi_show_id :=multi_show_id_type(); 
      multi_show_id.delete; 

      WHILE counter < 26 
      LOOP 
      ... 

EDIT: si vous voulez exécuter à travers la boucle 25 fois que vous avez besoin de changer la boucle while liée à 26 supérieure ...

+0

Il va ensuite rencontrer un autre problème. Quand il essaie d'étendre au-delà de 60. – David

+0

Non, il ne le fera pas. La varray est vidée à chaque voyage à travers la boucle i. Essayez-le. – DCookie

+0

ah ouais je vois que vous avez ajouté le DELETE aussi. – David

Questions connexes