2016-09-22 3 views
2

나는 VARRAY가 있으며 루프를 사용하여이 VARRAY에 요소를 추가하려고합니다. 이것은 내가 지금까지 시도한 것이다. 코드 위루프를 사용하여 VARRAY에 값을 추가하는 방법

DECLARE 
TYPE code_array_ IS VARRAY(26) OF VARCHAR2(6); 
codes_ code_array_; 

BEGIN 
FOR i IN 1..26 LOOP  
    codes_(i) := dbms_random.string('U',6); 
    END LOOP; 
END; 

은 나에게 오류를 제공

은 "ORA-06531 : 초기화되지 않은 컬렉션 참조"

+0

중첩 테이블이 아니라 VARRAY가 필요합니까? 26 제한 때문에 압도적으로 유용하기 때문에 중첩 테이블에서 가져 오는 기능이 손실됩니다. –

+0

@William_Robertson VArray는 요소 순서를 유지하지만 중첩 테이블 및 연관 배열은 유지하지 않습니다. 요소 순서가 필요한 응용 프로그램에서는 VARRAY가 유일한 옵션입니다. – JeramieH

답변

3

오류 메시지가 말했듯이, 당신은 initialise the collection variable해야합니다

... 
BEGIN 
    codes_ := code_array_(); 
    ... 

크기를 조정할 때마다 매번 단일 확장자를 사용하거나 루프 주위 :

FOR i IN 1..26 LOOP  
    codes_.extend; 
    ... 

또는 당신 전에 일회성 확장 시작 :

... 
BEGIN 
    codes_ := code_array_(); 
    ... 
    codes_.extend(26); 
    FOR i IN 1..26 LOOP  
    ... 
또한 다시 26 하드 코딩 저장, 루프를 제어하기 위해 후 확장 크기를 사용할 수

:

DECLARE 
    TYPE code_array_ IS VARRAY(26) OF VARCHAR2(6); 
    codes_ code_array_; 
BEGIN 
    codes_ := code_array_(); 
    codes_.extend(26); 
    FOR i IN 1..codes_.count LOOP  
    codes_(i) := dbms_random.string('U',6); 
    END LOOP; 
END; 
/

PL/SQL procedure successfully completed. 

Read more about collections.

0

varray를 생성자로 초기화하고 값을 컬렉션 변수의 특정 요소에 할당하기 전에 확장해야합니다. PLSQL 컨텍스트에서는 연관 컬렉션을 사용하는 것이 좋습니다.

declare 
    type code_array_ is varray(26) of varchar2(6); 
    codes_ code_array_ := code_array_(); 
begin 
    <<init_codes>> begin codes_.extend(26); 
     for i in codes_.first..codes_.last loop codes_(i) := dbms_random.string('U',6); 
    end loop; end init_codes; 
end; 
/

또는 sql을 사용하여 전체 모음을 초기화 할 수 있습니다.

declare 
    type code_array_ is varray(26) of varchar2(6); 
    codes_ code_array_; 
begin 
    select dbms_random.string('U',6) bulk collect into codes_ from dual connect by level<=26; 
end; 
/