PL / SQL: meilleure façon de compter les éléments d'un tableau?

14

Compte tenu de ceci:

DECLARE
  TYPE T_ARRAY IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
  MY_ARRAY T_ARRAY;
  V_COUNT INTEGER;

Je voudrais faire:

BEGIN
  -- ... some code filling the MY_ARRAY array

  -- obviously COUNT_ELEMENTS() does not exists, this is what I'm looking for :-)
  V_COUNT := COUNT_ELEMENTS(MY_ARRAY);

  DBMS_OUTPUT.PUT_LINE('My array containts ' || V_COUNT || ' elements.');
END;

Y a-t-il quelque chose de mieux que de créer une procédure faisant une boucle de base incrémentant un compteur? Peut-être qu'une fonction native PL / SQL fait déjà cela COUNT_ELEMENTS()?

Frosty Z
la source

Réponses:

26

Je pense que c'est ce que vous recherchez:

V_COUNT := MY_ARRAY.COUNT;
Philᵀᴹ
la source
8

Heureusement, j'ai trouvé dans le code PL / SQL existant que je dois maintenir, un comportement "natif" fonctionnel:

V_COUNT := MY_ARRAY.COUNT;

devrait faire l'affaire.

Celui-ci est très difficile à trouver avec Google, car "count" fait plus souvent référence à ce SELECT COUNT(...)qui peut être trouvé dans les requêtes SQL ...

Frosty Z
la source
5
Et voici un lien vers les documents :-)
Jack dit d'essayer topanswers.xyz le
5

Dans le cas d'une table imbriquée (c'est-à-dire sans INDEX BY BINARY_INTEGER), vous pouvez également utiliser CARDINALITY

V_COUNT := CARDINALITY(MY_ARRAY);

Différence importante: dans le cas de Nested-Table qui est NULL, COUNTdéclenche une exception, CARDINALITYretourne NULL.

Wernfried Domscheit
la source
+1 pour la CARDINALITÉ. Bien que cardinality () ne fonctionne pas pour les varrays :(
Tagar
2
declare
   type array_t is varray(10) of number(10);
   array array_t := array_t(1,2,3,4,5,6,7,8,9,10);
c number(10):=0;
b number(10):=0;
begin<<outer>>
   for i in 1..array.count loop
    if( mod(i,2)=0)
then
 c:=c+i;
end if;
   end loop;
dbms_output.put_line(c);
begin
    for i in 1..array.count loop
 if( mod(i,2)<>0)
then
 b:=b+i;
end if;
   end loop;
dbms_output.put_line(b);
end;
end outer;
/
mugunthinimkceit
la source
J'utiliserais un nom de variable différent de «tableau» pour le type «tableau_t». J'ai passé 20 minutes à lutter avec mon code avant de réaliser que «tableau» était la variable au lieu du type (car j'utilise beaucoup C, C # et Java).
justdan23
-5

Une méthode de base est:

for i in my_array.first .. my_array.last 
loop 
   v_count:=v_count+1;
end loop;
Sudipta Santra
la source
-1 cela ne fonctionnera pas pour un tableau associatif - voir ici pourquoi
Jack dit essayer topanswers.xyz
-1 c'est lent
Tagar