PL / SQL: лучший способ подсчитать элементы в массиве?

14

Учитывая это:

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

Я хотел бы сделать:

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;

Есть ли что-то лучше, чем создание процедуры, выполняющей основной цикл, увеличивающий счетчик? Может быть, встроенная функция PL / SQL уже делает это COUNT_ELEMENTS()?

Морозный Z
источник

Ответы:

26

Я думаю, что это то, что вы после:

V_COUNT := MY_ARRAY.COUNT;
Philᵀᴹ
источник
8

К счастью, в существующем коде PL / SQL, который я должен поддерживать, я обнаружил работающее «нативное» поведение:

V_COUNT := MY_ARRAY.COUNT;

должен сделать свое дело.

Это очень трудно найти в Google, так как «count» чаще относится к тому, SELECT COUNT(...)что можно найти в запросах SQL ...

Морозный Z
источник
5
А вот ссылка на документы :-)
Джек говорит, что попробуйте topanswers.xyz
5

В случае Nested-Table (т.е. без INDEX BY BINARY_INTEGER) вы также можете использовать CARDINALITY

V_COUNT := CARDINALITY(MY_ARRAY);

Важное отличие: в случае Nested-Table, который имеет значение NULL, COUNTвызывает исключение, CARDINALITYвозвращает NULL.

Вернфрид Домшайт
источник
+1 за КАРДИНАЛЬНОСТЬ. Хотя кардинальность () не работает для 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
источник
Я бы использовал имя переменной, отличное от «array» для типа «array_t». Я потратил 20 минут на борьбу со своим кодом, прежде чем понял, что «массив» - это переменная, а не тип (поскольку я часто использую C, C # и Java).
justdan23
-5

Основной метод:

for i in my_array.first .. my_array.last 
loop 
   v_count:=v_count+1;
end loop;
Судипта Сантра
источник
-1 это не будет работать для ассоциативного массива - посмотрите здесь, почему
Джек говорит попробуйте topanswers.xyz
-1 это slooow
Тагар