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

У разі вкладеної таблиці (тобто без INDEX BY BINARY_INTEGER) ви також можете використовувати КАРТИНАЛІТНІСТЬ

V_COUNT := CARDINALITY(MY_ARRAY);

Важлива відмінність: У разі Nested-Table, яка є NULL, COUNTпідвищує виняток, CARDINALITYповертає NULL.


+1 для КАРДІНАЛІТНОСТІ. Хоча cardinality () не працює для 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_t'. Я витратив 20 хвилин на боротьбу зі своїм кодом, перш ніж зрозумів, що "масив" є змінною замість типу (оскільки я використовую C, C # та Java багато).
justdan23

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.