2015-03-09 10 views
6

stworzyłem poniżej prosty dom, ale corazORA 06533: Indeks poza count

ORA 06533: Indeks dolny poza count

błąd.

Czy ktoś może mi powiedzieć, czego mi brakuje w poniższym kodzie.

declare 
    type salaryvarray is varray(6) of customers.salary%type; 
    salary_array salaryvarray:=salaryvarray(); 
    c_salary customers.salary%type; 
    i integer(2); 
    counter number(2); 
begin 
    salary_array.extend; 
    select count(*) into counter from customers; 
    for i in 1..counter loop 
    select salary into c_salary from customers where id =i; 
    salary_array(i):=c_salary; 
    end loop; 
end; 
/
+0

Ilu klientów tam jest? – Mat

+0

Wygląda na to, że wybierasz więcej klientów niż jest miejsce w Twoim winie, które ma miejsce na 6. Co ważniejsze, aby właściwie odpowiedzieć na to pytanie, co próbujesz osiągnąć? – ErikL

+2

Musisz rozszerzyć w pętli. W tej chwili tylko przydzielasz pamięć dla pojedynczego przedmiotu. To powiedziawszy, potencjalnie się zepsuje, jeśli kiedykolwiek będziesz mieć więcej niż 6 klientów, o których wspomniał @ErikL. –

Odpowiedz

1

Twój salary_array może pomieścić maksymalnie 6 wynagrodzenia klienta, ale twoi select count(*) into counter from customers zwraca więcej niż 6 rekordów.

Z tego powodu tablica nie jest w stanie pomieścić danych lub umieścić w nich inne słowa Indeks indeksu in-limit był większy niż liczba zmiennych.

+0

Podczas gdy nadal jest problemem, błąd, o którym myślisz, to "ORA-06532: Subscript outside of limit". Ten błąd "ORA 06533: Subscript beyond count" jest spowodowany próbą dodania rekordu bez przydzielania pamięci za pomocą wywołania 'extend'. –

5

Część kodu musi znajdować się wewnątrz pętli. Za każdym razem, gdy je dodajesz, przydzielasz nową pamięć. Pomijanie tego kroku powoduje, że kod zapisuje coś, nie dając mu miejsca.

declare 
    type salaryvarray is varray(6) of customers.salary%type; 
    salary_array salaryvarray:=salaryvarray(); 
    c_salary customers.salary%type; 
    i integer(2); 
    counter number(2); 
begin 
    select count(*) into counter from customers; 
    for i in 1..counter loop 
    salary_array.extend; -- Extend for each value. 
    select salary into c_salary from customers where id =i; 
    salary_array(i):=c_salary; 
    end loop; 
end; 
/

Będziesz bardzo prawdopodobny bieg do podobnego błędu wkrótce jednak ORA-06532: Subscript outside of limit. Ograniczasz VARRAY do 6 elementów, ale klienci mogą mieć więcej. Rozważ ograniczenie powrotu, rozszerzenie VARRAY lub wdrożenie bardziej dynamicznego typu kolekcji.

Powiązane problemy