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 สำหรับ CARDINALITY แม้ว่า 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' สำหรับประเภท 'array_t' ฉันใช้เวลา 20 นาทีในการต่อสู้กับรหัสของฉันก่อนที่ฉันจะรู้ว่า 'อาร์เรย์' เป็นตัวแปรแทนที่จะเป็นประเภท (เนื่องจากฉันใช้ C, C #, และ Java มาก)
justdan23

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.