PL / SQL: il modo migliore per contare gli elementi in un array?


14

Dato ciò:

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

Mi piacerebbe fare:

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;

Esiste qualcosa di meglio della creazione di una procedura che esegue un ciclo di base per incrementare un contatore? Forse una funzione nativa PL / SQL lo fa già COUNT_ELEMENTS()?

Risposte:


26

Penso che questo sia ciò che stai cercando:

V_COUNT := MY_ARRAY.COUNT;

8

Fortunatamente, ho trovato nel codice PL / SQL esistente che devo mantenere un comportamento "nativo" funzionante:

V_COUNT := MY_ARRAY.COUNT;

dovrebbe fare il trucco.

Questo è molto difficile da trovare con Google, poiché "count" si riferisce più frequentemente a quello SELECT COUNT(...)che si trova nelle query SQL ...


5
Ed ecco un link ai documenti :-)
Jack dice di provare topanswers.xyz il

5

Nel caso di una tabella nidificata (ovvero senza INDEX BY BINARY_INTEGER) è anche possibile utilizzare CARDINALITÀ

V_COUNT := CARDINALITY(MY_ARRAY);

Differenza importante: nel caso di Nested-Table che è NULL, COUNTgenera un'eccezione, CARDINALITYrestituisce NULL.


+1 per CARDINALITÀ. Sebbene la cardinalità () non funzioni per gli array :(
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;
/

Vorrei usare un nome di variabile diverso da "array" per il tipo "array_t". Ho passato 20 minuti a lottare con il mio codice prima di rendermi conto che 'array' era la variabile anziché il tipo (dal momento che uso C, C # e Java molto).
justdan23,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.