PL / SQL: cách tốt nhất để đếm các phần tử trong một mảng?


14

Đưa ra điều này:

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

Tôi muốn làm:

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;

Có một cái gì đó tốt hơn so với việc tạo một thủ tục thực hiện một vòng lặp cơ bản tăng một bộ đếm? Có lẽ một hàm riêng PL / SQL đã làm điều này COUNT_ELEMENTS()?

Câu trả lời:


26

Tôi nghĩ rằng đây là những gì bạn sau:

V_COUNT := MY_ARRAY.COUNT;

8

May mắn thay, tôi đã tìm thấy trong mã PL / SQL hiện có mà tôi phải duy trì, một hành vi "nguyên gốc" đang hoạt động:

V_COUNT := MY_ARRAY.COUNT;

nên làm thủ thuật.

Cái này rất khó tìm thấy với Google, vì "tính" thường được đề cập nhiều hơn đến SELECT COUNT(...)cái có thể tìm thấy trong các truy vấn SQL ...


5
đây là một liên kết đến các tài liệu :-)
Jack Douglas

5

Trong trường hợp Bảng lồng nhau (nghĩa là không có INDEX BY BINARY_INTEGER), bạn cũng có thể sử dụng CARDINALITY

V_COUNT := CARDINALITY(MY_ARRAY);

Sự khác biệt quan trọng: Trong trường hợp Bảng Nested là NULL, COUNTsẽ đưa ra một ngoại lệ, CARDINALITYtrả về NULL.


+1 cho THẺ. Mặc dù cardinality () không hoạt động cho 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;
/

Tôi sẽ sử dụng một tên biến khác với 'mảng' cho loại 'mảng_t'. Tôi đã dành 20 phút vật lộn với mã của mình trước khi tôi nhận ra 'mảng' là biến thay vì loại (vì tôi sử dụng C, C # và Java rất nhiều).
justdan23

-5

Một phương pháp cơ bản là:

for i in my_array.first .. my_array.last 
loop 
   v_count:=v_count+1;
end loop;

-1 điều này sẽ không hoạt động cho một mảng kết hợp - xem tại đây để biết lý do
Jack Douglas

-1 đây là slooow
Tagar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.