PL / SQL: cara terbaik untuk menghitung elemen dalam array?

14

Mengingat ini:

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

Saya akan melakukan:

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;

Apakah ada sesuatu yang lebih baik daripada membuat prosedur dengan melakukan loop dasar menambah penghitung? Mungkin fungsi PL / SQL asli sudah melakukan ini COUNT_ELEMENTS()?

Frosty Z
sumber

Jawaban:

26

Saya pikir inilah yang Anda cari:

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

Untungnya, saya menemukan kode PL / SQL yang ada yang harus saya pertahankan, perilaku "asli" yang berfungsi:

V_COUNT := MY_ARRAY.COUNT;

harus melakukan trik.

Yang ini sangat sulit ditemukan dengan Google, karena "menghitung" lebih sering merujuk pada SELECT COUNT(...)yang dapat ditemukan dalam kueri SQL ...

Frosty Z
sumber
5
Dan ini tautan ke dokumen :-)
Jack bilang coba topanswers.xyz
5

Dalam hal Nested-Table (yaitu tanpa INDEX BY BINARY_INTEGER) Anda juga dapat menggunakan CARDINALITY

V_COUNT := CARDINALITY(MY_ARRAY);

Perbedaan penting: Dalam kasus Nested-Table yang NULL, COUNTmemunculkan exception, CARDINALITYmengembalikan NULL.

Wernfried Domscheit
sumber
+1 untuk CARDINALITY. Meskipun kardinalitas () tidak berfungsi untuk 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
sumber
Saya akan menggunakan nama variabel yang berbeda dari 'array' untuk tipe 'array_t'. Saya menghabiskan 20 menit bergulat dengan kode saya sebelum saya menyadari 'array' adalah variabel, bukan tipe (karena saya menggunakan C, C #, dan banyak Java).
justdan23
-5

Metode dasar adalah:

for i in my_array.first .. my_array.last 
loop 
   v_count:=v_count+1;
end loop;
Sudipta Santra
sumber
-1 ini tidak akan bekerja untuk array asosiatif - lihat di sini untuk alasannya
Jack mengatakan coba topanswers.xyz
-1 ini slooow
Tagar