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

Ответы:



8

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

V_COUNT := MY_ARRAY.COUNT;

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

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


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

Я бы использовал имя переменной, отличное от «array» для типа «array_t». Я потратил 20 минут на борьбу со своим кодом, прежде чем понял, что «массив» - это переменная, а не тип (поскольку я часто использую C, C # и Java).
justdan23

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.