es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Recibo este error extraño sin importar lo que haga, dice que el índice está fuera de rango. ¿Algún consejo?

Cualquier parámetro que le dé cuando ejecuto este procedimiento, siempre dice que mi índice debe ser más bajo. Por ejemplo, si le doy los parámetros (1,1), dice que mi índice es 61 y debería estar en el rango de 1 a 60.

Ambas de estas tablas tienen dos columnas, la primera tiene id_produs e id_departament, la segunda tiene id_produs e id_comanda. Ambas tablas tienen números de un solo dígito insertados en ambas columnas, pero nada funciona. ¿Ves algo particularmente malo?

CREATE OR REPLACE PROCEDURE procedura_6
    (v_produse_2 produs_departament.id_produs%type, v_produse_5 comanda_produs.id_produs%type )
IS 
    TYPE varray_produse_2 IS VARRAY(60) OF produs_departament.id_produs%type;
    TYPE nested_table_produse_5 IS TABLE OF comanda_produs.id_produs%type;
    varray_numar_dept varray_produse_2:=varray_produse_2();
    nested_table_numar_com nested_table_produse_5:=nested_table_produse_5();
BEGIN 
    SELECT id_produs BULK COLLECT INTO varray_numar_dept FROM produs_departament;
    SELECT id_produs BULK COLLECT INTO nested_table_numar_com FROM comanda_produs;

for l_index in varray_numar_dept.FIRST..varray_numar_dept.LAST
LOOP
    IF (v_produse_2>varray_numar_dept(l_index)) THEN
    DBMS_OUTPUT.PUT_LINE(varray_numar_dept(l_index));
    END IF;
END LOOP;

for l_index in nested_table_numar_com.FIRST..nested_table_numar_com.LAST
LOOP
    IF v_produse_5>nested_table_numar_com(l_index) THEN
        DBMS_OUTPUT.PUT_LINE(nested_table_numar_com(l_index));
    END IF;
END LOOP;

END procedura_6;
/

execute procedura_6(2,2);

begin
    procedura_6(3,3);
end;
/
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en los operadores de comparación utilizados en las instrucciones IF. El signo ‘>’ debería ser reemplazado por el signo ‘<‘ en ambas instrucciones IF. La versión corregida del código es la siguiente:

    “`
    CREATE OR REPLACE PROCEDURE procedura_6
    (v_produse_2 produs_departament.id_produs%type, v_produse_5 comanda_produs.id_produs%type )
    IS
    TYPE varray_produse_2 IS VARRAY(60) OF produs_departament.id_produs%type;
    TYPE nested_table_produse_5 IS TABLE OF comanda_produs.id_produs%type;
    varray_numar_dept varray_produse_2:=varray_produse_2();
    nested_table_numar_com nested_table_produse_5:=nested_table_produse_5();
    BEGIN
    SELECT id_produs BULK COLLECT INTO varray_numar_dept FROM produs_departament;
    SELECT id_produs BULK COLLECT INTO nested_table_numar_com FROM comanda_produs;

    for l_index in varray_numar_dept.FIRST..varray_numar_dept.LAST
    LOOP
        IF (v_produse_2 > varray_numar_dept(l_index)) THEN
            DBMS_OUTPUT.PUT_LINE(varray_numar_dept(l_index));
        END IF;
    END LOOP;
    
    for l_index in nested_table_numar_com.FIRST..nested_table_numar_com.LAST
    LOOP
        IF v_produse_5 > nested_table_numar_com(l_index) THEN
            DBMS_OUTPUT.PUT_LINE(nested_table_numar_com(l_index));
        END IF;
    END LOOP;
    

    END procedura_6;
    /

    execute procedura_6(2,2);

    begin
    procedura_6(3,3);
    end;
    /

Comments are closed.