写入数组时出错 plsql 如何解决?扩展也不起作用



所以我试图在PL/SQL中写入数组,但我总是得到超出限制的下标错误。我看过类似的帖子,并根据这些答案实施了所有内容,我似乎找不到自己做错了什么。给出错误的行是"0";arr_quartosLivres(计数器(:=q.id"我已经尝试过扩展数组,但它仍然不起作用,然而,不管怎样,look只运行了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;
varray的索引值以1开头。您的逻辑正在尝试使用索引值0。因此索引超出范围。当声明varray具有固定大小时,BTW扩展不适用于varray。您有3种解决方案:将计数器初始化为1而不是0,或者在将其用作索引之前将其递增。因为在循环中,即使IF条件返回false并且不将计数器用作索引,也会在数组中留下NULL值,因此每次循环都会递增。但使用counter有两个不同的目的:计算已处理的行数和对数组进行索引。由于行值可能不会放入数组中,因此您的第三个选项是为索引引入另一个变量。此外,不需要BEGIN。。。循环中的结束块。
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; 

最新更新