340 likes | 482 Views
Estructura general de un programa en el servidor de Bases de Datos. Sintaxis general: CREATE PROCEDURE sp_name ([ parameter[ ,…] ] ) routine_body Donde: parameter : [ IN | OUT | INOUT ] param_name type type : Cualquier tipo de dato válido para mysql. routine_body : comandos SQL válidos.
E N D
Estructura general de un programa en el servidor de Bases de Datos
Sintaxis general: CREATE PROCEDURE sp_name ([ parameter[ ,…] ] ) routine_body Donde: • parameter: [ IN | OUT | INOUT ] param_name type • type: Cualquier tipo de dato válido para mysql. • routine_body: comandos SQL válidos
CREATE PROCEDURE sp_name ([ parameter[ ,…] ] ) routine_body • Bloque Cabecera • Bloque de Ejecución
Tipos de Programas en el lado del servidor: • Procedimientos almacenados • Funciones de Usuario. • Triggers. (se verá después)
El punto y coma (;) es el delimitador por defecto. • Los procedimientos almacenados y funciones pueden contener varias sentencias que terminan con este delimitador. • Se debe indicar a MySQL que temporalmente NO lo usaremos como carácter delimitador, eso lo haremos usando la sentencia DELIMITER.
BEGIN - END • [etiqueta_inicio:] BEGIN • [lista_sentencias] • END [etiqueta_fin] • La sintaxis BEGIN ... END se utiliza para escribir sentencias compuestas que pueden aparecer en el interior de procedimientos almacenados. • Una sentencia compuesta puede contener múltiples sentencias, encerradas por las palabras BEGIN y END. • lista_sentencias es una lista de una o más sentencias. • Cada sentencia dentro de lista_sentencias debe terminar con un punto y como (;) delimitador de sentencias.
DECLARE • El comando DECLARE se usa para definir variables locales que se utilizarán dentro de los PA. • DECLARE puede usarse sólo dentro de comandos compuestos BEGIN ... END y deben ser su inicio, antes de cualquier otro comando.
CREATE PROCEDURE sp_name ([ parameter[ ,…] ] ) Begin Declare… … End • Bloque Cabecera • Bloque de Ejecución • Bloque de Declaracion
Como se invocan??? • PROCEDURE: sentencia call • mysql> call nombre_del_procedimiento(); • FUNCTION: select • mysql> select nombre_funcion(); • TRIGGER: no se invoca
Recordando… • Funciones SQL estándar. • Clasificación: • Funciones Numéricas. • Agregación. • Fecha y Hora. • Cadena de caracteres. • Otras. • Investigar sobre fns. SQL estándar.
Sintaxis: • CREATE FUNCTION sp_name ([parameter[,...]]) RETURNS type routine_body • Una funcion (FUNCTION) es un procedimiento almacenado (PROCEDURE). • Difieren de los procedimientos en: • La lista de parámetros solo puede contener parámetros de entrada. • IN, OUT o INOUT es solo válido para PA. • Una funcion siempre debe retornar un valor del tipo definido en la declaracion de la funcion. • Las fns. pueden ser llamadas dentro de sentencias sql • Una funcion no puede devolver un registro de datos.
delimiter // CREATE FUNCTION Cubo(Numero float) RETURNS float BEGIN declare cubo1 float; set cubo1=(Numero * Numero * Numero); return cubo1; END; // Si requiero utilizar esta fn… Select cubo(4),…. Select cubo(numero) from tabla
Crear una tabla con Nombre, Nota 1, Nota 2, Nota 3. • Crear una función que calcule el promedio de estas 3 notas. • Notas sin decima.
DELIMITER // CREATE FUNCTION promedio_normal (numero1 int, numero2 int, numero3 int) RETURNS float BEGIN declare prom float; set prom=((numero1+numero2+numero3)/3); return prom; END; // • select nota1, nota2, nota3, promedio_normal(nota1, nota2, nota3) from alumno;
DELIMITER // CREATE FUNCTION promedio_normal_otro (numero1 int, numero2 int, numero3 int) RETURNS float BEGIN declare sum int; declare prom float; set sum=numero1+numero2+numero3; set prom=(sum/3); return prom; END; //
Notas con una decima. • Promedio de notas con una decima.
DELIMITER // CREATE FUNCTION promedio_decimas (numero1 float, numero2 float, numero3 float) RETURNS float BEGIN declare prom float; set prom=round(((numero1+numero2+numero3)/3),1); return prom; END; //
Crear una función que calcule el promedio ponderado de estas 3 notas (decimal). • Ponderacion: 20%, 30%, 50%
DELIMITER // CREATE FUNCTION promedio_ponderado (numero1 float, numero2 float, numero3 float) RETURNS float BEGIN declare prom float; set prom=round((numero1*0.2+numero2*0.3+numero3*0.5),1); return prom; END; //
DELIMITER // CREATE FUNCTION promedio_ponderado_cual (numero1 float, numero2 float, numero3 float, p1 int, p2 int, p3 int) RETURNS float BEGIN declare prom float; set prom=round((numero1*p1/100+numero2*p2/100+numero3*p3/100),1); return prom; END; //
Ponderaciones suman 1… • Qué pasa si la suma de ponderaciones no suman 1??? • Qué se puede hacer?
BLOQUE IF IF expresión THEN … ELSE … … END IF;
WHILE WHILE expresión DO -- contenido del bucle END WHILE;
REPEAT – UNTIL REPEAT -- CODE DEL BUCLE UNTIL variable >= 1 END REPEAT;
CASE (similar al SWITCH o SELEC CASE de algunos lenguajes de programación) CASE variable WHEN 1 THEN -- que hacer en caso de que variable = 1 WHEN 2 THEN -- que hacer en caso de que variable = 2 WHEN x THEN -- que hacer en caso de que variable = x ELSE -- que hacer en caso de que no se presente alguno de los casos anteriores END CASE;
DELIMITER // • CREATE FUNCTION promedio_ponderado_if (numero1 float, numero2 float, numero3 float, p1 int, p2 int, p3 int) RETURNS float • BEGIN • declare prom float; • if (p1+p2+p3)=100 then • set prom=round((numero1*p1/100+numero2*p2/100+numero3*p3/100),1); • return prom; • else • set prom=1; • return prom; • end if; • END; • //
Tarea: • Para la BD Universidad crear una función que calcule la cantidad de horas semanales de una asignatura en función de sus creditos: • Cantidad de horas asignatura=creditos*3
Tarea: • Para la BD universidad cree una función que calcule la edad a partir de la fecha de nacimiento. • Probar con resultados decimales. • Probar con resultados enteros.
Recursividad…una función puede llamarse a si misma… • Sin embargo Mysql no permite llamadas recursivas. • Tarea: • Crear una función que calcule el factorial de un numero: 5! = 5*4*3*2*1