PL / SQL: ¿la mejor manera de contar elementos en una matriz?

14

Dado este:

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

Me gustaría hacer:

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;

¿Hay algo mejor que crear un procedimiento haciendo un ciclo básico que incremente un contador? ¿Quizás una función nativa PL / SQL ya hace esto COUNT_ELEMENTS()?

Z escarchado
fuente

Respuestas:

26

Creo que esto es lo que buscas:

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

Afortunadamente, encontré en el código PL / SQL existente que tengo que mantener, un comportamiento "nativo" que funciona:

V_COUNT := MY_ARRAY.COUNT;

debería hacer el truco.

Este es muy difícil de encontrar con Google, ya que "contar" se refiere con mayor frecuencia al SELECT COUNT(...)que se puede encontrar en las consultas SQL ...

Z escarchado
fuente
55
Y aquí hay un enlace a los documentos :-)
Jack dice que intente topanswers.xyz
5

En el caso de una tabla anidada (es decir, sin INDEX BY BINARY_INTEGER), también puede usar CARDINALITY

V_COUNT := CARDINALITY(MY_ARRAY);

Diferencia importante: en caso de Nested-Table que es NULL, COUNTgenera una excepción, CARDINALITYdevuelve NULL.

Wernfried Domscheit
fuente
+1 para CARDINALIDAD. Aunque cardinality () no funciona 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
fuente
Usaría un nombre de variable diferente a 'array' para el tipo 'array_t'. Pasé 20 minutos luchando con mi código antes de darme cuenta de que 'array' era la variable en lugar del tipo (ya que uso C, C # y Java mucho).
justdan23
-5

Un método básico es:

for i in my_array.first .. my_array.last 
loop 
   v_count:=v_count+1;
end loop;
Sudipta Santra
fuente
-1 esto no funcionará para una matriz asociativa - mira aquí por qué
Jack dice que intente topanswers.xyz
-1 esto es lento
Tagar