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.

Múltiples funciones llamando a una misma función. Necesito crear una bandera.

Múltiples funciones llamando a una misma función. Necesito crear una bandera.
Supongamos que tengo 4 funciones (f1, f2, f3 y f4) en un paquete PLSQL.
F1 está siendo llamada por F2, F3 y F4. Lo único que quiero es una bandera para rastrear qué función llamó a F1.
Por ejemplo, si f2 llamó a f1, entonces flag=2; flag=3 cuando f3 llamó a f1, y así sucesivamente. Y esto debería ser accesible de tal manera que pueda utilizar esta bandera dentro de la función F1.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Para rastrear qué llamadas de función F1, podemos crear una variable privada en el paquete PL/SQL y establecer su valor antes de llamar a F1. La variable puede ser accedida por F1 para determinar qué función la llama.

    Aquí tienes un ejemplo de implementación:

    CREATE OR REPLACE PACKAGE my_package AS
      flag NUMBER := 0;
    
      FUNCTION f1 RETURN NUMBER;
      FUNCTION f2 RETURN NUMBER;
      FUNCTION f3 RETURN NUMBER;
      FUNCTION f4 RETURN NUMBER;
    END my_package;
    /
    
    CREATE OR REPLACE PACKAGE BODY my_package AS
      FUNCTION f1 RETURN NUMBER AS
      BEGIN
        -- Accede a la variable flag para determinar qué función llamó a F1
        IF flag = 2 THEN
          DBMS_OUTPUT.PUT_LINE('F1 fue llamada por F2');
        ELSIF flag = 3 THEN
          DBMS_OUTPUT.PUT_LINE('F1 fue llamada por F3');
        ELSIF flag = 4 THEN
          DBMS_OUTPUT.PUT_LINE('F1 fue llamada por F4');
        ELSE
          DBMS_OUTPUT.PUT_LINE('F1 fue llamada sin establecer la bandera');
        END IF;
    
        RETURN 1;
      END f1;
    
      FUNCTION f2 RETURN NUMBER AS
      BEGIN
        -- Establece la variable flag para rastrear qué función está llamando a F1
        flag := 2;
    
        -- Llama a F1
        RETURN f1;
      END f2;
    
      FUNCTION f3 RETURN NUMBER AS
      BEGIN
        flag := 3;
        RETURN f1;
      END f3;
    
      FUNCTION f4 RETURN NUMBER AS
      BEGIN
        flag := 4;
        RETURN f1;
      END f4;
    END my_package;
    /
    

    En esta implementación, la variable privada flag se establece inicialmente en 0. Cuando una función llama a F1, establece el valor de flag a su propio identificador (2, 3 o 4 en este ejemplo). F1 luego puede acceder a la variable flag para determinar qué función la llamó.

    Para probar esta implementación, podemos ejecutar las siguientes declaraciones SQL:

    -- Llama a F2, que establece la bandera en 2 y luego llama a F1
    SELECT my_package.f2 FROM DUAL;
    
    -- Llama a F3, que establece la bandera en 3 y luego llama a F1
    SELECT my_package.f3 FROM DUAL;
    
    -- Llama a F4, que establece la bandera en 4 y luego llama a F1
    SELECT my_package.f4 FROM DUAL;
    

    Estas declaraciones producirán los siguientes resultados:

    F1 fue llamada por F2
    1
    
    F1 fue llamada por F3
    1
    
    F1 fue llamada por F4
    1
    

    Como era de esperar, F1 es capaz de determinar qué función la llamó en función del valor de la variable flag.

Comments are closed.