PL / SQL: melhor maneira de contar elementos em uma matriz?

14

Dado isto:

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

Eu gostaria de fazer:

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;

Existe algo melhor do que criar um procedimento que faça um loop básico incrementando um contador? Talvez uma função nativa PL / SQL já faça isso COUNT_ELEMENTS()?

Z gelado
fonte

Respostas:

26

Eu acho que é isso que você procura:

V_COUNT := MY_ARRAY.COUNT;
Philᵀᴹ
fonte
8

Felizmente, encontrei no código PL / SQL existente que tenho que manter um comportamento "nativo" em funcionamento:

V_COUNT := MY_ARRAY.COUNT;

deve fazer o truque.

Este é muito difícil de encontrar no Google, já que "count" se refere mais frequentemente ao SELECT COUNT(...)que pode ser encontrado nas consultas SQL ...

Z gelado
fonte
5
E aqui está um link para os documentos :-)
Jack diz que tenta topanswers.xyz 24/01
5

No caso de uma tabela aninhada (ou seja, sem INDEX BY BINARY_INTEGER), você também pode usar CARDINALITY

V_COUNT := CARDINALITY(MY_ARRAY);

Diferença importante: No caso de Nested-Table que é NULL, COUNTgera uma exceção e CARDINALITYretorna NULL.

Wernfried Domscheit
fonte
+1 para CARDINALIDADE. Embora cardinality () não funcione para 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
fonte
Eu usaria um nome de variável diferente de 'array' para o tipo 'array_t'. Passei 20 minutos lutando com meu código antes de perceber que 'array' era a variável em vez do tipo (já que eu uso muito C, C # e Java).
Just2623
-5

Um método básico é:

for i in my_array.first .. my_array.last 
loop 
   v_count:=v_count+1;
end loop;
Sudipta Santra
fonte
-1 isto não funcionará para uma matriz associativa - veja aqui o porquê
Jack diz que tente topanswers.xyz 27/02/12 -
-1 esta é slooow
Tagar