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()있습니까?

답변:


26

나는 이것이 당신이 추구하는 것이라고 생각합니다.

V_COUNT := MY_ARRAY.COUNT;

8

다행히도 기존 PL / SQL 코드에서 작동하는 "기본"동작을 찾았습니다.

V_COUNT := MY_ARRAY.COUNT;

트릭을해야합니다.

"count"는 SELECT COUNT(...)SQL 쿼리에서 찾을 수있는 것을 더 자주 참조하기 때문에 Google에서는 찾기가 매우 어렵습니다 ...


5
그리고 여기에 워드 프로세서 :-)에 대한 링크
잭 topanswers.xyz 시도라고

5

Nested-Table의 경우 (예 :없이 INDEX BY BINARY_INTEGER) CARDINALITY 를 사용할 수도 있습니다.

V_COUNT := CARDINALITY(MY_ARRAY);

중요한 차이점 : NULL 인 Nested-Table의 경우 COUNT예외가 발생하고 CARDINALITYNULL을 반환합니다.


카디널리티 +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_t'유형에 'array'와 다른 변수 이름을 사용합니다. 'array'가 유형 대신 변수라는 것을 깨닫기 전에 20 분 동안 코드로 씨름했습니다 (C, C # 및 Java를 많이 사용하기 때문에).
justdan23

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.