sql >> Base de Datos >  >> RDS >> Oracle

Llamar a la función privada dentro del cuerpo del paquete

El problema que tiene (suponiendo que está llamando al procedimiento/función con el nombre correcto de la manera correcta) es que está intentando invocar una llamada a una función que aún no se ha declarado. Hay dos formas de evitar esto, suponiendo que desee mantener la función en privado:

  1. Declare la función ADD_STUDENT antes de cualquier procedimiento/función que la invoque.
  2. Utilice declaración directa para declarar la función antes de que se invoque.

Entonces, para la opción 1, su código de ejemplo se vería así:

PACKAGE BODY SCHOOL AS
    FUNCTION ADD_STUDENT(...)
        ...
    END ADD_STUDENT;

    PROCEDURE ADD_PEOPLE(...)
        ...
        some_var := ADD_STUDENT();
    END ADD_PEOPLE;
END SCHOOL;
/

Y para la opción 2, su código se vería así:

PACKAGE BODY SCHOOL AS
    -- forward declared function
    FUNCTION ADD_STUDENT(...);

    PROCEDURE ADD_PEOPLE(...)
        ...
        some_var := ADD_STUDENT();
    END ADD_PEOPLE;

    FUNCTION ADD_STUDENT(...)
        ...
    END ADD_STUDENT;
END SCHOOL;
/

Personalmente, prefiero la opción 1, ya que significa que hay menos cosas abarrotando el cuerpo del paquete, pero la opción 2 podría ser necesaria si tiene dos módulos que hacen referencia entre sí.