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()?

Respuestas:



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 ...


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.


+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;
/

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.