PL / SQL: najlepszy sposób zliczania elementów w tablicy?

14

Biorąc to pod uwagę:

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

Chciałbym zrobić:

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;

Czy istnieje coś lepszego niż utworzenie procedury wykonującej podstawową pętlę zwiększającą licznik? Może natywna funkcja PL / SQL już to robi COUNT_ELEMENTS()?

Frosty Z
źródło

Odpowiedzi:

26

Myślę, że o to ci chodzi:

V_COUNT := MY_ARRAY.COUNT;
Philᵀᴹ
źródło
8

Na szczęście znalazłem w istniejącym kodzie PL / SQL, który muszę zachować, działające „natywne” zachowanie:

V_COUNT := MY_ARRAY.COUNT;

powinien załatwić sprawę.

Ten jest bardzo trudny do znalezienia w Google, ponieważ „count” częściej odnosi się do tych, SELECT COUNT(...)które można znaleźć w zapytaniach SQL ...

Frosty Z
źródło
5
A oto link do dokumentacji :-)
Jack mówi, spróbuj wypróbować topanswers.xyz
5

W przypadku tabeli zagnieżdżonej (tj. Bez INDEX BY BINARY_INTEGER) możesz również użyć KARDINALNOŚCI

V_COUNT := CARDINALITY(MY_ARRAY);

Ważna różnica: w przypadku tabeli zagnieżdżonej, która ma wartość NULL, COUNTpodnosi wyjątek, CARDINALITYzwraca wartość NULL.

Wernfried Domscheit
źródło
+1 za KARDINALNOŚĆ. Chociaż cardinality () nie działa dla 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
źródło
Użyłbym innej nazwy zmiennej niż „tablica” dla typu „tablica_t”. Spędziłem 20 minut zmagając się z moim kodem, zanim zdałem sobie sprawę, że „tablica” była zmienną zamiast typu (ponieważ używam C, C # i Java dużo).
justdan23
-5

Podstawową metodą jest:

for i in my_array.first .. my_array.last 
loop 
   v_count:=v_count+1;
end loop;
Sudipta Santra
źródło
-1 to nie zadziała dla tablicy asocjacyjnej - zobacz tutaj, dlaczego
Jack mówi, spróbuj wypróbować topanswers.xyz
-1, to jest powolne
Tagar