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.

Error “PLS-00302: el componente ‘MIN’ debe ser declarado” al intentar encontrar el valor mínimo/máximo

Estoy recibiendo el error “PLS-00302: el componente ‘MIN’ debe ser declarado” al intentar encontrar el valor mínimo/máximo para un viaje a cierta distancia. ¿Alguna idea?

crear o reemplazar procedimiento longandshortdist (p<em>distance en número)
es
  cursor longshortcursor es 
    seleccionar source</em>town, destination<em>town, distance
    de distancias
    donde la distancia = p</em>distance;
  distance_row longshortcursor%rowtype;

<p>begin
  para distance<em>row en longshortcursor
  loop
    dbms</em>output.put<em>line('la ciudad de origen es: ' || distance</em>row.source<em>town || 'la ciudad de destino es: ' || distance</em>row.destination<em>town || 'el viaje más corto es: ' || 
    distance</em>row.min(distancia) || 'el viaje más largo es: ' || distance_row.max(distance));</p>

<p>end loop;
end;

El código de error que estoy obteniendo:

12/1 PL/SQL: Statement ignored
12/169 PLS-00302: componente 'MIN' debe ser declarado
Errores: revisa el registro del compilador

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el componente ‘MIN’ debe ser declarado. Esto suele ocurrir cuando no se ha importado el paquete que contiene la función MIN. En este caso, deberías importar el paquete estándar ‘SYS.STDDEV_LIB’ añadiendo la siguiente línea antes de la declaración CREATE OR REPLACE:

    CREATE OR REPLACE PACKAGE pkg
    AS
        FUNCTION distance_min(distance_list IN sys.odcinumberlist)
            RETURN NUMBER;
        FUNCTION distance_max(distance_list IN sys.odcinumberlist)
            RETURN NUMBER;
    END pkg;
    /
    CREATE OR REPLACE PACKAGE BODY pkg
    AS
        FUNCTION distance_min(distance_list IN sys.odcinumberlist)
            RETURN NUMBER
        IS
            min_val NUMBER;
        BEGIN
            SELECT MIN(column_value) INTO min_val FROM TABLE(distance_list);
            RETURN min_val;
        END distance_min;
    
        FUNCTION distance_max(distance_list IN sys.odcinumberlist)
            RETURN NUMBER
        IS
            max_val NUMBER;
        BEGIN
            SELECT MAX(column_value) INTO max_val FROM TABLE(distance_list);
            RETURN max_val;
        END distance_max;
    END pkg;
    

    Luego, modifica tu procedimiento para utilizar estas funciones en lugar de las funciones MIN/MAX integradas:

    create or replace procedure longandshortdist (p_distance in number)
    is
        cursor longshortcursor is 
            select source_town, destination_town, distance
            from distances
            where distance = p_distance;
        distance_row longshortcursor%rowtype;
    
        distance_list sys.odcinumberlist := sys.odcinumberlist(); 
    
    begin
        for distance_row in longshortcursor
        loop
            distance_list.extend();
            distance_list(distance_list.count) := distance_row.distance;
            dbms_output.put_line('source town is: ' || distance_row.source_town || 
                                 ' destination town is: ' || distance_row.destination_town || 
                                 ' shortest trip is: ' || pkg.distance_min(distance_list) || 
                                 ' longest trip is: ' || pkg.distance_max(distance_list));
        end loop;
    end;
    

    Esto debería solucionar el error y permitirte encontrar los valores mínimos y máximos para un viaje de distancia.

Comments are closed.