2009-06-18 3 views
0

하나의 VARRAY를 여러 번 사용하는 스크립트가 있습니다. 그러나 VARRAY를 한 번 반복 한 후 재설정하는 방법을 알아낼 수 없습니다. 나는 내 문제를 해결하기 위해 다음과 같은 기본 스크립트를 썼다가 한 번만 배열을 통해 반복 될 때VARRAY를 여러 번 채우는 방법

DECLARE 
    TYPE multi_show_id_type IS VARRAY (60) OF VARCHAR2 (10); 

    multi_show_id multi_show_id_type := multi_show_id_type(); 
    counter  NUMBER := 1; 
    i    NUMBER := 1; 
BEGIN 
    DBMS_OUTPUT.put_line ('BEGIN'); 

    WHILE i < 10 
    LOOP 
     DBMS_OUTPUT.put_line (i); 
     --counter:=0; 
     --multi_show_id :=multi_show_id_type(); 
     --multi_show_id.delete; 

     WHILE counter < 25 
     LOOP 
     multi_show_id.EXTEND(); 
     multi_show_id (counter) := counter * counter; 
     DBMS_OUTPUT.put_line ('VArray: [' || counter || '] [' || multi_show_id (counter) || ']'); 

     counter := counter + 1; 
     END LOOP; 
     i := i + 1; 
    END LOOP; 

    DBMS_OUTPUT.put_line ('END'); 
END; 
/

이 스크립트가 작동합니다. 그러나 counter:=0 행의 주석 처리를 제거하면 배열 모집단 루프를 10 번 반복해야하므로 ORA-06532 오류가 발생합니다. 다른 주석 처리 된 줄에서 내가 시도한 것들을 볼 수 있습니다. 어떤 도움을 주시면 감사하겠습니다.

답변

0

여기에는 두 가지 문제가있는 것으로 보입니다. 첫째, VARRAY 색인은 1 초에 시작합니다. VARRAY가 선언에 정의 된대로 60 개 항목으로 가득 차면 중지됩니다.

는 다음을 사용 :

TYPE multi_show_id_type IS VARRAY (250) OF VARCHAR2 (10);

및 주석

counter:=1;

각 루프 1에서 시작하려는 경우 multi_show_id :=multi_show_id_type(); 라인

. 4 개 이하의 값을 보장하려면 inner while 루프가 해당 제한을 만들어야합니다.

+0

방법 이게 내 문제를 해결합니까? VARRAY가 모든 루프에서 다시 시작되기를 바란다. 내 실제 프로그램의 경우 배열에 4 개 이상의 값이 저장되지 않으며 일반적으로 하나만 저장됩니다. –

1

실제로 @akf는 정확합니다. VARRAY가 0이 아닌 항목 1에서 시작하기 때문에 작성된 코드는 작동하지 않습니다.

는 thusly 히 코드를 변경

와 그것을 작동 :

... 
    LOOP 
      DBMS_OUTPUT.put_line (i); 
      counter:=1; 
      --multi_show_id :=multi_show_id_type(); 
      multi_show_id.delete; 

      WHILE counter < 26 
      LOOP 
      ... 

편집 : ... 당신은 루프를 통해 25 번 실행하려는 경우 상위 26에 바인딩 WHILE 루프를 변경해야합니까

+0

그 다음 다른 문제가 발생합니다. 그가 60을 넘어서 확장하려고 할 때. – David

+0

아니, 그는하지 않을 것이다. Varray는 i 루프를 통해 각 여행에서 비 웁니다. 시도 해봐. – DCookie

+0

아아 네, DELETE를 다시 추가 한 것을 볼 수 있습니다. – David