PL / SQL: Bester Weg, um Elemente in einem Array zu zählen?

14

Angesichts dessen:

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

Ich möchte zu tun:

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;

Gibt es etwas Besseres, als eine Prozedur zu erstellen, die eine einfache Schleife durchführt, die einen Zähler inkrementiert? Vielleicht macht das bereits eine native PL / SQL-Funktion COUNT_ELEMENTS()?

Frosty Z
quelle

Antworten:

26

Ich denke, das ist, was Sie suchen:

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

Glücklicherweise habe ich in dem vorhandenen PL / SQL-Code, den ich pflegen muss, ein funktionierendes "natives" Verhalten gefunden:

V_COUNT := MY_ARRAY.COUNT;

sollte den Trick machen.

Dieser ist bei Google sehr schwer zu finden, da sich "count" häufiger auf das bezieht, SELECT COUNT(...)was in SQL-Abfragen zu finden ist ...

Frosty Z
quelle
5
Und hier ist ein Link zu den Dokumenten :-)
Jack Douglas
5

Im Falle einer verschachtelten Tabelle (dh ohne INDEX BY BINARY_INTEGER) können Sie auch CARDINALITY verwenden

V_COUNT := CARDINALITY(MY_ARRAY);

Wichtiger Unterschied: Im Fall einer NULL-geschachtelten Tabelle wird COUNTeine Ausnahme CARDINALITYausgelöst und NULL zurückgegeben.

Wernfried Domscheit
quelle
+1 für KARDINALITÄT. Obwohl cardinality () nicht für varrays funktioniert :(
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
quelle
Ich würde einen anderen Variablennamen als 'array' für den Typ 'array_t' verwenden. Ich habe 20 Minuten mit meinem Code gerungen, bevor mir klar wurde, dass 'array' die Variable anstelle des Typs ist (da ich viel C, C # und Java verwende).
Justdan23
-5

Eine grundlegende Methode ist:

for i in my_array.first .. my_array.last 
loop 
   v_count:=v_count+1;
end loop;
Sudipta Santra
quelle
-1 Dies funktioniert nicht für ein assoziatives Array - siehe hier, warum
Jack Douglas
-1 Das ist Slooow
Tagar