Lecciones del módulo (2/4)
Lógica avanzada con PL/pgSQL
Las funciones escritas en LANGUAGE sql solo pueden ejecutar consultas estándar una tras otra. Si necesitáramos algo más avanzado como "SI el total ingresado es mayor que 100, ENTONCES aplique un descuento", SQL simple no puede hacerlo por sí solo. Necesitamos utilizar PL/pgSQL, un lenguaje de programación de procedimientos completo integrado en Postgres.
En PL/pgSQL agregamos los cuerpos clásicos hechos de BEGIN .. END, variables y declaraciones condicionales.
CREATE OR REPLACE FUNCTION valuta_cliente(ordini INTEGER)
RETURNS TEXT AS $$
BEGIN
IF ordini > 10 THEN
RETURN 'VIP';
ELSE
RETURN 'Standard';
END IF;
END;
$$ LANGUAGE plpgsql;¡Este poder nos permite descargar bloques masivos de lógica repetitiva que de otro modo escribiríamos en JS, empaquetándolos en funciones rápidas y seguras ejecutadas cerca de los datos con una latencia muy baja!
Pruébalo tú mismo
Queremos una función compleja que se reemplace a sí misma si ya existe ('get_price_label'), acepte 'precio' como NUMÉRICO y devuelva un TEXTO detallado. Utilice PL/pgSQL. Abra BEGIN. Escriba la lógica: si el precio es > 100,00, devuelva la cadena 'Premium'. ELSE devuelve 'Economico'. Cierra el FINAL condicional; y el cuerpo.
Mostrar pista
CREAR O REEMPLAZAR FUNCIÓN get_price_label(precio NUMÉRICO) DEVUELVE EL TEXTO COMO $$ COMIENZA SI el precio > 100,00 ENTONCES DEVUELVE 'Premium'; ELSE REGRESA 'Económico'; FINALIZAR SI; FIN; $$ IDIOMA plpgsql;
Solución disponible después de 3 intentos
Puede declarar variables temporales antes de BEGIN con la palabra clave DECLARE. Escriba una función 'saluta_utente(userid INTEGER)' -> Devuelve TEXTO, lógica PL/pgSQL. Dentro de ella DECLARE una variable de cadena 'nome_utente TEXT;'. Luego, dentro de BEGIN, complete esa variable con el nombre consultando dinámicamente 'clientes' usando la cláusula especial 'SELECT first_name INTO nome_utente DESDE... DONDE id = ID de usuario'. Finalmente, RETURN concatena la variable a 'Ciao'.
Mostrar pista
DECLARAR nome_utente TEXTO; COMENZAR SELECCIONAR nombre EN nome_utente... REGRESAR 'Ciao ' || nombre_utente;
Solución disponible después de 3 intentos