Oracle

Funciones en PLSQL

Por : Jhons_1101
2018-11-26
Tags :

Una función bien se puede ver como una serie de instrucciones contenida dentro de un mismo proceso, con la finalidad de resolver un problema real de una manera que sea mas fácil y ordenada.
Se utilizan típicamente para transformar grandes cantidades de datos en aplicaciones de almacenamiento de datos.

Una función puede tomar parámetros y devolver un único valor, la declaración de parametros son opcionales

La función poseee dos partes:

  • La especificación
  • El cuerpo


Las funciones tienen una estructura similar a la de los procedimientos almacenados (storage procedure), tienen una cabecera, una sección de declaración de variables y el bloque "begin...end" que encierra las acciones.
también contiene la clausula o palabra reservada "return".

¿Qué es lo que puede contener en las especificación de una función?

Una descripción de la palabra clave y opcionalmente parámetros



¿Qué es lo que puede contener en el cuerpo de una función?

Una parte declarativa opcional, una parte ejecutable y una parte opcional de control de excepciones

  • La parte declarativa contiene declaraciones de tipos, cursores, constantes, variables, excepciones y subprogramas.
  • La parte ejecutable contiene instrucciones que asignan valores, controlan la ejecución y manipulan los datos.
  • La parte de control de excepciones contiene controladores que se ocupan de las excepciones generadas durante la ejecución.


  • Algunas palabras claves:

  • IN, OUT, IN OUT "definen el comportamiento de los parámetros formales"
  • NOCOPY "una sugerencia del compilador (no directiva) que permite que el compilador PL/SQL pase y se desactiven los parámetros por referencia en lugar de por valor (por defecto)."
  • PIPELINED "canalizado especifica que se devuelvan los resultados de una función de tabla iterativamente. "
  • RETURN "Introduce la cláusula devoluciones, que especifica el tipo de la clase de valor devuelto."
  • := | DEFAULT "Inicializa en parámetros a valores predeterminados."


  • Dentro de una función nosotros podemos usar o llamar a los procedimentos almacenados, recordemos también que podemos devolver tanto como una variable o un conjunto de resultados, también podemos combinar una funcion dentro de una consulta.



    La Forma de llamar a una función

    La manera de llamar a una función sería a través de su nombre. Ejemplo: fn_getTotalEstudiantes();
    Ya sea en un bloque anónimo, en otra función o en un procedimiento.
    compartir en facebook compartir en Google compartir en Twitter compartir en Blogger compartir como código embebido compartir la url
    Sintaxis

    
    CREATE [OR REPLACE] 
    FUNCTION function_name 
    	[(parameter_name [IN | OUT | IN OUT] type [, ...])] 
    	RETURN return_datatype 
    	{IS | AS} 
    BEGIN 
    	< function_body > 
    END [function_name];
    
    




    Casos prácticos de uso de funciones

    
    ------------------------------------------------------------------------------------
    -- Ejemplo...
    -- Se define una función para obtener el total de estudiantes
    ------------------------------------------------------------------------------------
    CREATE OR REPLACE 
    FUNCTION fn_getTotalEstudiantes 
    RETURN number IS 
       total number(4) := 0; 
    BEGIN 
       SELECT count(*) INTO total 
       FROM tbl_estudiantes; 
        
       RETURN total; 
    END; 
    ----------------------------------------------
    -- Ejemplo de uso por bloque anónimo
    ----------------------------------------------
    BEGIN 
       dbms_output.put_line('Total de estudiantes: ' || totalCustomers()); 
    END;
    
    

    
    ------------------------------------------------------------------------------------
    -- Ejemplo:
    -- Compara dos valores y devuelve el de número mayor
    ------------------------------------------------------------------------------------
    FUNCTION fn_getMayorNumero(
    	pty_num1   IN NUMBER,
    	pty_num2   IN NUMBER
    )  
    RETURN NUMBER 
    IS 
        lnu_salida  NUMBER; 
    BEGIN 
    	IF pty_num1 > pty_num2 THEN 
    		lnu_salida:= pty_num1; 
    	ELSE 
    		lnu_salida:= pty_num2; 
    	END IF;
    
    	RETURN lnu_salida;
    END;
    ----------------------------------------------
    -- Ejemplo de uso por bloque anónimo
    ----------------------------------------------
    DECLARE 
    	a  NUMBER; 
    	b  NUMBER; 
    	c  NUMBER; 
    BEGIN 
    	a  := 23; 
    	b  := 45;  
    	c  := fn_getMayorNumero(a, b);
       dbms_output.put_line(' número mayor: ' || c);
    END; 
    
    

    
    ------------------------------------------------------------------------------------
    -- Ejemplo:
    -- Se declara una función para traer el nombre del estudiante por código de estudiante
    ------------------------------------------------------------------------------------
    CREATE OR REPLACE 
    Function fn_getNomEstudiante (
        pty_codEstudiante   IN NUMBER
    )
       RETURN VARCHAR2
    IS
        lvc_nomEstudiante  VARCHAR2(500);
    BEGIN
    
        SELECT (NOM1_ESTUDIANTE ||' '|| NOM2_ESTUDIANTE ||' '|| APE1_ESTUDIANTE ||' '|| APE2_ESTUDIANTE) AS NOMBRE INTO lvc_nomEstudiante
        FROM tbl_estudiantes
        WHERE UPPER(COD_ESTUDIANTE) = pty_codEstudiante;
    
    RETURN lvc_nomEstudiante;
    END;
    
    

    Ejemplo funcion fn_getNomEstudiante en PL/SQL




    Funciones recursivas PL / SQL

    Se le conoce como función recursiva cuando una función se llama a sí mismo, se le conoce como una llamada recursiva y el proceso se conoce como recursión.

    
    ------------------------------------------------------------------------------------
    -- Ejemplo:
    -- Calcula el factorial de un número dado llamándose a sí mismo recursivamente
    -- La función factorial multiplica todos los números enteros positivos que hay 
    -- entre ese número y el 1.
    ------------------------------------------------------------------------------------
    DECLARE 
        num NUMBER; 
        factorial NUMBER;
    FUNCTION fn_getFactorial(X NUMBER) 
    RETURN NUMBER  
    IS 
       F NUMBER; 
    BEGIN 
    
        IF X = 0 THEN 
            F := 1; 
        ELSE 
            F := X * fn_getFactorial(X-1); -- Aqui es donde se vuelve función recursiva
        END IF; 
        
        RETURN F; 
    END;
    ----------------------------------------------
    -- Ejemplo de uso por bloque anónimo
    ----------------------------------------------
    BEGIN 
       num       := 64; 
       factorial := fn_getFactorial(num); 
       dbms_output.put_line('El Factorial de '|| num || ' es ' || factorial); 
    END; 
    ----------------------------------------------
    -- Salida dbms_output
    ----------------------------------------------
    -- El Factorial de 6 es 720
    
    

    ejemplo función recursiva en PL/SQL



    Eliminar una función PL/SQL


    
    ------------------------------------------------------------------------------------
    -- Drop Function:
    -- Una vez que haya creado su función en Oracle, es posible que necesite 
    -- eliminarla de la base de datos.
    ------------------------------------------------------------------------------------
    DROP FUNCTION function_name;
    -- Donde function_name 
    -- Es el nombre de la función que desea eliminar
    
    --
    Ejemplo:
    DROP FUNCTION fn_getLikeEstudiante;
    --Este ejemplo eliminaría la función llamada fn_getLikeEstudiante; 
    -- Veamos la imagen..
    
    

    ejemplo borrado de una función en PL/SQL


    Este POST se ha hecho gracias a la colaboración de Keylor Eduardo Lopez, quien aportó a la comunidad de elbauldelcodigo.com esta documentación.
    Redes sociales: WhatsApp: +505 7780 6654






    Si este contenido te fue útil, no olvides compartirlo en redes sociales, Considéralo. Puede ser la manera de agradecer!


    Agrega tu comentario...

    Puedes utilizar etiquetas <pre></pre>, <p></p>, <div></div>, + (Nombre usuario, para responderle a alguien)

    eguCv0J





    Este post no tiene comentarios, sé el primero en hacerlo
    Esta entrada no cuenta con imágenes adjuntas

    Unete al grupo de whatsApp +57 316 392 6456

    Sigue el grupo en facebook

    Siguenos.....