Ошибка при записи в массив plsql как исправить? Продлить тоже не работает

поэтому я пытаюсь записать массив в PL/SQL, и я всегда получаю индекс за пределами ошибки ограничения. Я видел похожие сообщения и реализовал все на основе этих ответов, я не могу найти, что я делаю неправильно. Строка с ошибкой: «arr_quartosLivres(counter) := q.id;» Я пытался расширить массив, и он все еще не работает, однако в любом случае просмотр выполняется только 21 раз (потому что в таблице quarto всего 21 значение), поэтому его даже не нужно расширять. Любая помощь будет высоко оценен! Спасибо

SET SERVEROUTPUT ON;

DECLARE
    p_idReserva reserva.id%type := 408;
    v_dataEntradaReserva reserva.data_entrada%type;
    counter integer := 0;

    type arr_aux IS varray(21) of quarto.id%type;
    arr_quartosLivres arr_aux := arr_aux(); 

BEGIN
    SELECT data_entrada INTO v_dataEntradaReserva FROM reserva WHERE id = p_idreserva;

    FOR q IN (SELECT * FROM quarto)
    LOOP
        BEGIN
            IF isQuartoIndisponivel(q.id, v_dataEntradaReserva) 
            THEN    DBMS_OUTPUT.PUT_LINE('nao disponivel' || counter);
                arr_quartosLivres(counter) := q.id;
            ELSE DBMS_OUTPUT.PUT_LINE('disponivel' || counter);
            END IF;
            counter := counter + 1;
        END;
    END LOOP;
END;
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Значения индекса для varray начинаются с 1. Ваша логика пытается использовать значение индекса 0. Таким образом, индекс выходит за пределы допустимого диапазона. Кстати, расширение не применяется к varray, если объявлен varray фиксированного размера. У вас есть 3 решения: инициализировать счетчик равным 1 вместо 0 или увеличить его до использования в качестве индекса. Так как в его нынешнем виде вы увеличиваете каждый раз в цикле, даже когда условие IF возвращает false, и вы не используете счетчик в качестве индекса, оставляя значение NULL в массиве. Но вы используете счетчик для двух разных целей: Подсчет обработанных строк и индексировать в массив. Поскольку значение строки не может быть помещено в массив, ваш третий вариант - ввести другую переменную для индекса. Далее блок BEGIN...End в цикле не нужен.

declare
    p_idreserva reserva.id%type := 408;
    v_dataentradareserva reserva.data_entrada%type;
    counter integer := 0;

    type arr_aux is varray(21) of quarto.id%type;
    arr_quartoslivres arr_aux := arr_aux(); 
    varray_index integer := 1 ; -- index varaibal for varray.
begin
    select data_entrada into v_dataentradareserva from reserva where id = p_idreserva;

    for q in (select * from quarto)
    loop
         if isquartoindisponivel(q.id, v_dataentradareserva) 
         then
             dbms_output.put_line('nao disponivel' || counter || ' at index ' || varray_index); 
             arr_quartoslivres(varray_index) := q.id;
             varray_index :=  varray_index + 1;
         else 
            dbms_output.put_line('disponivel' || counter);
         end if;
         counter := counter + 1;
    end loop;
end; 

 

Другие вопросы по теме