Como hemos comentado en el post de procedimientos almacenados, tener nuestras funciones y procedimientos en MySQL en lugar de de procesar los datos con algún lenguaje del lado del servidor, como PHP , tiene la ventaja de que viaja menos información de la base de datos al servidor web , con el consiguiente aumento del rendimiento y que estas funciones harán que podamos atacar la base de datos desde cualquier otro lenguaje, como Java o ASP.NET sin tener que volver a procesar los datos otra vez.

MySQL tiene muchas funciones que podemos usar en nuestro procedimientos almacenados y consultas, pero en ocasiones podemos necesitar crear nuestras propias funciones para hacer cosas más especializadas…

Vamos a ver cómo crear funciones en MySQL:

DELIMITER //
 
CREATE FUCNTION holaMundo() RETURNS VARCHAR(20)
BEGIN
    RETURN ‘HolaMundo’;
END
//

Para comprobar que funciona tecleamos lo siguiente en la consola de MySQL :

SELECT holaMundo();

Lo que devuelve el siguiente resultado :

mysql> select holaMundo()//
 
+--------------+
| holaMundo()  |
+--------------+
| Hola Mundo!! |
+--------------+
1 row in set (0.00 sec)

Para borrar la función que acabamos de crear :

DROP FUNCTION IF EXISTS holaMundo

Uso de las variables en funciones:

Las variables en las funciones se usan de igual manera que en los procedimientos almacenados, se declaran con la sentencia DECLARE, y se asignan valores con la sentencia SET.

DELIMITER //
 
CREATE FUNCTION holaMundo() RETURNS VARCHAR(30)
BEGIN
  DECLARE salida VARCHAR(30) DEFAULT 'Hola mundo';
;
  SET salida = ‘Hola mundo con VARIABLES’;
  RETURN salida;
END
//

Esta variable es de ámbito local, y será destruida una vez finalice la función. Cabe destacar el uso de la sentencia DEFAULT en conjunto con DECLARE, que asigna un valor por defecto al declarar la variable.

Uso de parámetros en funciones:

DROP FUNCTION IF EXISTS holaMundo
 
CREATE FUNCTION holaMundo(entrada VARCHAR(20)) RETURNS VARCHAR(20)
BEGIN
  DECLARE salida VARCHAR(20);
  SET salida = entrada;
  RETURN salida;
END

Ahora hemos creado una función que devuelve el mismo valor que le pasamos como parámetro.

Si tecleamos :

mysql> select holaMundo("nosolocodigo")//
+---------------------------+
| holaMundo("nosolocodigo") |
+---------------------------+
| nosolocodigo             |
+---------------------------+
1 row in set (0.00 sec)

Obtenemos como resultado lo mismo que le hemos pasado como párametro, en este caso “nosolocodigo”

Para finalizar, algo un poco más complejo, vamos a crear una función que acepte un dividendo y un divisor y haga una división sin usar el operador división:

CREATE FUNCTION divide(dividendo int,divisor int) returns int
begin
    declare aux int;
    declare contador int;
    declare resto int;
    SET contador = 0;
    SET aux = 0;
    while (aux + divisor) <= dividendo do
        SET aux = aux + divisor ;
        SET contador = contador + 1;
    end while;
    SET resto = dividendo - aux ;
RETURN contador;
end;
//

Para usarlo, simplemente llamaríamos a la función así:

SELECT divide(20,2)

Lo que devolvería 10.

Mirar el post sobre el control de flujo con procedimientos almacenados si no entiendes esta última función.

Compartir:
  • del.icio.us
  • BarraPunto
  • Bitacoras.com
  • Facebook
  • Google Bookmarks
  • Meneame
  • Netvibes
  • Technorati
  • FriendFeed
  • Twitter
  • HelloTxt


Comentarios

  1. 1
    slovacus
    24 de Septiembre del 2008 a las 10:08 am

    pucha chevre causa pero no puedo executarlo desde phpmyadmin

  2. 2
    Raslocks
    9 de Octubre del 2008 a las 9:30 am

    Que tal ,, excelente post
    Como puedo hacer una funcion para buscar un id de una tabla con el nombre…

    DELIMITER //

    CREATE FUNCTION BuscarIDProducto`(StrgBuscado varchar(30)) returns int

    BEGIN
    return
    select Productos.IDproducto From Productos
    where productos.NombreProducto = Strbuscado;

    END//

    DELIMITER ;

    esto se me ocurrio, pero marca error

  3. 3
    Jose Luis Deras
    8 de Noviembre del 2008 a las 12:05 am

    Raslocks. Segun yo en funciones no se puede hacer referencias, lo podrias hacer usando un procedure.

    Por otro lado a ver si saben que es lo que esta fallando
    aca:

    CREATE FUNCTION check_letter (letter char(1) ) RETURNS char(1)
    LANGUAGE SQL
    DETERMINISTIC
    BEGIN
    DECLARE vletter char(1);

    IF CHAR_LENGTH(letter) != 1 THEN
    CALL BAD_letter_ENTRY;
    END IF;

    SELECT UCASE(letter) INTO vletter;

    RETURN vletter;
    END;;

    Es que no entra nunca al if, solo cuando el parametro es ”.

  4. 4
    Johann
    17 de Noviembre del 2008 a las 5:49 pm

    es posible que esa consulta te devuelva mas de un registro, y segun entiendo una funcion solo puede devolverte un objeto o un registro

  5. 5
    gerardp
    21 de Enero del 2009 a las 12:44 pm

    lo que debes hacer para que t retorne el id es un insert into asi:

    select id into w_retorno from tabla where nombre=’nombre’;

    return w_retorno;

    pero debes fijarte q solo t devuelva un registro por que originaria un errorr

    por eso primero deberias hacer esto

    select count(*) into contador from tabla where nombre=’nombre’;

    if contador==1 then
    select id into w_retorno from tabla where nombre=’nombre’;
    else
    return “”;
    end if

    return w_retorno;

    saludos
    escribeme cualquier duda

  6. 6
    David
    11 de Mayo del 2009 a las 7:27 pm

    Hola José Luis, me parece que lo que te falta es que iguales vletter con letter, algo así:

    set vletter = letter;

    ya que si te das cuenta, estas evaluando letter y no vletter, así cuando retornas vletter estas pasando una valor vacío.

    Seguro que ya has resuelto tu problema pero talvez para otros pueda servir.

    Saludos

    David

  7. 7
    Carmen
    20 de Mayo del 2009 a las 10:19 am

    Como puedo crear una funcion en MySql que haga lo siguiente. Necesito contar solo las horas de 6 de la mañana a 6 de la tarde sin tomar en cuenta de 6:01 de la tarde a 5:59 de la mañana.

    Tengo 2 campos que son fecha inicial y final que los tengo en tipo datetime como tengo que trabajar con la hora debo separar la fecha de la hora.

  8. 8
    henry
    21 de Mayo del 2009 a las 9:31 am

    Hola

    tengo una funcion pero no se como llamarla desde la consola o donde tengo que escribir la funcion

  9. 9
    FR@NK0
    29 de Julio del 2009 a las 8:11 pm

    Alguien me podria ayudar a hacer ls siguiente funcion es que soy nuevo es esto y le entiendo muy poco:

    **Funcion que resiba un numero entre el 0 y el 99 y que devuelva el valor en letra.

    Por ejemplo: 0 – cero
    47 – cuarenta y siete
    36 – treinta y seis
    99 – novenra y nueve

  10. 10
    Luis Edwin A A
    11 de Octubre del 2009 a las 7:31 am

    DELIMITER |
    CREATE FUNCTION FUNCION_01
    (NUM INT) RETURNS TEXT
    BEGIN
    CASE NUM
    WHEN 1 THEN RETURN ‘UNO’;
    WHEN 2 THEN RETURN ‘DOS’;
    WHEN 3 THEN RETURN ‘TRES’;
    WHEN 4 THEN RETURN ‘CUATRO’;
    WHEN 5 THEN RETURN ‘CINCO’;
    WHEN 6 THEN RETURN ‘SEIS’;
    WHEN 7 THEN RETURN ‘SIETE’;
    END CASE;
    END
    DELIMITER |

    Y asi sucesivamente, no es el mas eficiente pero te puede servir

  11. 11
    percy
    23 de Octubre del 2009 a las 1:59 am

    Buenas, me preguntaba si es posible usar Funciones anidadas?, pero viendo el o los ejemplos mostrados no creo k se pueda, podrias poner un ejemplo de uso de funciones?, porfa y una ultima pregunta solo las funciones pueden retornar un valor?.

    Gracias por tu tiempo.

  12. 12
    Fernando Pérez
    23 de Noviembre del 2009 a las 7:26 am

    Estoy impresionado con este blog, espero aprender y aportar conocimientos

  13. 13
    Inma
    16 de Diciembre del 2009 a las 9:13 pm

    Hola,

    Estoy trabajando actualmente con mysql pero no encuntro ninguna orden para consultar funciones ya realizadas. ¿como podria hacer una consulta por consola de una funcion creada?

Trackbacks

  1. Cómo crear funciones en MySQL « SirViejo