Curso de MariaDB Desde la Consola/StoredFunciones
Stored Functions
Sintaxis
CREATE [OR REPLACE]
[DEFINER = {user | CURRENT_USER}]
FUNCTION func_name ([func_parameter[,...]])
RETURNS type
[characteristic ...]
RETURN func_body
func_parameter:
param_name type
type:
Any valid MariaDB data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
func_body:
Valid SQL procedure statement
Descripción
Una stored function es una función definida que se llama desde dentro de una instrucción SQL como una función regular, y devuelve un único valor.
Creación de funciones almacenados
He aquí un ejemplo de esqueleto para ver una función almacenada en acción:
1 DELIMITER //
2
3 CREATE FUNCTION CuarentayDos() RETURNS TINYINT DETERMINISTIC
4 BEGIN
5 DECLARE x TINYINT;
6 SET x = 42;
7 Return x;
8 END
9
10 //
11
12 DELIMITER ;
En primer lugar, el delimitador se cambia, ya que la definición de función contendrá el delimitador de punto y coma regular. A continuación, la función se llama CuarentayDos y definido para devolver un tinyint. La palabra clave DETERMINISTIC no es necesario en todos los casos (aunque si el log binario está activado, dejando fuera generará un error), y es ayudar al optimizador de consultas elige un plan de consulta. Una función determinista es aquel que, teniendo en cuenta los mismos argumentos, siempre devolverá el mismo resultado.
A continuación, el cuerpo de la función se coloca entre BEGIN y END declaraciones. Se declara un tinyint, x, que simplemente se establece en 42, y este es el resultado devuelto.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| Prueba1 |
| PythonClase |
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.04 sec)
MariaDB [(none)]> use Prueba1;
Database changed
MariaDB [Prueba1]> DELIMITER //
MariaDB [Prueba1]>
MariaDB [Prueba1]> CREATE FUNCTION CuarentayDos() RETURNS TINYINT DETERMINISTIC
BEGIN
DECLARE x TINYINT;
SET x = 42;
Return x;
END //
Query OK, 0 rows affected (0.08 sec)
MariaDB [Prueba1]> DELIMITER ;
MariaDB [Prueba1]> show function status;
+---------+--------------+----------+----------------+---------------------+---------------------+---------------+---------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment |
+---------+--------------+----------+----------------+---------------------+---------------------+---------------+---------+
| Prueba1 | CuarentayDos | FUNCTION | root@localhost | 2016-10-17 13:13:17 | 2016-10-17 13:13:17 | DEFINER | |
+---------+--------------+----------+----------------+---------------------+---------------------+---------------+---------+
+----------------------+----------------------+--------------------+
| character_set_client | collation_connection | Database Collation |
+----------------------+----------------------+--------------------+
| utf8 | utf8_general_ci | utf8_unicode_ci |
+----------------------+----------------------+--------------------+
1 row in set (0.05 sec)
MariaDB [Prueba1]> show create function CuarentayDos;
+--------------+----------+
| Function | sql_mode |
+--------------+----------+
| CuarentayDos | |
+--------------+----------+
+------------------------------------------------------------------------------------+
| Create Function |
+------------------------------------------------------------------------------------+
! |
! CREATE DEFINER=`root`@`localhost` FUNCTION `CuarentayDos`() RETURNS tinyint(4) |
! DETERMINISTIC |
! BEGIN |
! DECLARE x TINYINT; |
! SET x = 42; |
! Return x; |
! END |
+------------------------------------------------------------------------------------+
+----------------------+----------------------+--------------------|
| character_set_client | collation_connection | Database Collation |
+----------------------+----------------------+--------------------|
| utf8 | utf8_general_ci | utf8_unicode_ci |
|----------------------+----------------------+--------------------+
1 row in set (0.00 sec
MariaDB [Prueba1]> select CuarentayDos();
+----------------+
| CuarentayDos() |
+----------------+
| 42 |
+----------------+
1 row in set (0.00 sec)
Por supuesto, una función que no tiene ningún argumento es de poca utilidad.
MariaDB [Prueba1]> drop function CuarentayDos; Query OK, 0 rows affected (0.08 sec) MariaDB [Prueba1]> show function status; Empty set (0.00 sec)
He aquí un ejemplo más complejo:
1 DELIMITER //
2
3 CREATE FUNCTION VatCents( precio DECIMAL(10,2) ) RETURNS INT DETERMINISTIC
4 BEGIN
5 DECLARE x INT;
6 SET x = precio * 114;
7 Return x;
8 END //
9 Query OK, 0 filas afectadas (0,04 seg)
10 DELIMITER ;
Esta función toma un argumento, el precio que se define como un decimal, y devuelve un int.
Para encontrar las funciones almacenadas se están ejecutando en el servidor, use SHOW FUNCTION STATUS.
MariaDB [Prueba1]> show function status \G
*************************** 1. row ***************************
Db: Prueba1
Name: VatCents
Type: FUNCTION
Definer: root@localhost
Modified: 2016-10-17 14:47:15
Created: 2016-10-17 14:47:15
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_unicode_ci
1 row in set (0.00 sec)
o consultar la tabla de rutinas en la base de datos directamente INFORMATION_SCHEMA:
MariaDB [Prueba1]> SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE='FUNCTION'; +--------------+ | ROUTINE_NAME | +--------------+ | VatCents | +--------------+ 1 row in set (0.21 sec)
Para saber lo que hace la función almacenada, use SHOW CREATE FUNCTION.
MariaDB [Prueba1]> SHOW CREATE FUNCTION VatCents \G
********************* 1. row *********************
Function: VatCents
sql_mode:
Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `VatCents`(price DECIMAL(10,2)) RETURNS int(11)
DETERMINISTIC
BEGIN
DECLARE x INT;
SET x = price * 114;
RETURN x;
END
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_unicode_ci
1 row in set (0.00 sec)
MariaDB [Prueba1]> select VatCents(100);
+---------------+
| VatCents(100) |
+---------------+
| 11400 |
+---------------+
1 row in set (0.00 sec)
Para cambiar las características de una stored function, utilice la función ALTER. Tenga en cuenta que no puede cambiar los parámetros o el cuerpo de una stored function utilizando esta directivo; para hacer tales cambios, tendrá que quitar y volver a crear la función usando DROP FUNCTION y CREATE FUNCTION.