Conceptos básicos de las funciones PL/pgSQL
Escriba funciones PL/pgSQL con parámetros, RETURNS TABLE, flujo de control (IF, LOOP, FOREACH) y gestión de excepciones.
Conceptos básicos de las funciones PL/pgSQL es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué es PL/pgSQL?
El lenguaje procedimental integrado de PostgreSQL. SQL ampliado con variables, flujo de control, excepciones y la capacidad de llamar consultas dinámicamente. Se utiliza para procedimientos almacenados y funciones de trigger.
Esqueleto de una función
Una función sencilla:
CREATE OR REPLACE FUNCTION add(a INT, b INT)
RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
SELECT add(2, 3); -- 5Variables
Declare con DECLARE; asigne valores con := o INTO:
CREATE FUNCTION user_orders(uid BIGINT)
RETURNS INT AS $$
DECLARE
cnt INT;
BEGIN
SELECT COUNT(*) INTO cnt FROM orders WHERE user_id = uid;
RETURN cnt;
END;
$$ LANGUAGE plpgsql STABLE;Flujo de control
IF / ELSE, FOR, WHILE, CASE:
IF cnt = 0 THEN
RAISE NOTICE 'no orders';
ELSIF cnt < 10 THEN
RAISE NOTICE 'few';
ELSE
RAISE NOTICE 'many';
END IF;
FOR i IN 1..10 LOOP
RAISE NOTICE '%', i;
END LOOP;Recorrer los resultados de una consulta
Iteración al estilo de un cursor:
CREATE FUNCTION recalc_totals() RETURNS VOID AS $$
DECLARE
r RECORD;
BEGIN
FOR r IN SELECT id FROM users LOOP
UPDATE users SET
order_count = (SELECT COUNT(*) FROM orders WHERE user_id = r.id)
WHERE id = r.id;
END LOOP;
END;
$$ LANGUAGE plpgsql;RETURNS TABLE
Devuelva un conjunto de resultados:
CREATE FUNCTION top_buyers(n INT)
RETURNS TABLE (user_id BIGINT, total NUMERIC) AS $$
BEGIN
RETURN QUERY
SELECT o.user_id, SUM(o.total)
FROM orders o
GROUP BY o.user_id
ORDER BY SUM(o.total) DESC
LIMIT n;
END;
$$ LANGUAGE plpgsql STABLE;
SELECT * FROM top_buyers(10);Parámetros IN / OUT / INOUT
Varios valores de retorno:
CREATE FUNCTION stats(uid BIGINT,
OUT total NUMERIC,
OUT cnt INT) AS $$
BEGIN
SELECT SUM(total), COUNT(*) INTO total, cnt
FROM orders WHERE user_id = uid;
END;
$$ LANGUAGE plpgsql STABLE;
SELECT * FROM stats(42); -- total | cntGestión de excepciones
BEGIN ... EXCEPTION WHEN ... THEN:
BEGIN
INSERT INTO users (email) VALUES ($1);
EXCEPTION
WHEN unique_violation THEN
RAISE NOTICE 'email already exists';
WHEN OTHERS THEN
RAISE;
END;RAISE para registrar mensajes
Niveles: DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION:
RAISE NOTICE 'processed % rows', cnt;
RAISE EXCEPTION 'bad state: %', state USING ERRCODE = 'check_violation';Marcadores de volatilidad
Marque las funciones correctamente para el planificador:
- IMMUTABLE — los mismos argumentos siempre producen el mismo resultado (sin E/S); permite el inlining y el uso con índices
- STABLE — los mismos argumentos producen el mismo resultado dentro de una consulta
- VOLATILE — el resultado puede variar en cada llamada (predeterminado; es correcto para NOW() y RANDOM())
SECURITY DEFINER
Se ejecuta con los privilegios del propietario de la función; úselo con cuidado:
CREATE FUNCTION sensitive_op() RETURNS VOID
LANGUAGE plpgsql
SECURITY DEFINER
AS $$ ... $$;
-- Always set search_path explicitly to avoid hijacking:
ALTER FUNCTION sensitive_op() SET search_path = public, pg_temp;Recapitulación
PL/pgSQL amplía SQL con bucles, IF, excepciones y retornos estructurados. Úselo para lógica cohesionada de varios pasos que se beneficie de ejecutarse cerca de los datos.
Comprobación rápida
¿Qué marcador de volatilidad debe usar para una función que devuelve el mismo resultado con los mismos argumentos y no tiene efectos secundarios ni realiza operaciones de E/S?
Preguntas frecuentes
¿La lección «Conceptos básicos de las funciones PL/pgSQL» es gratis?
Sí — el texto completo de «Conceptos básicos de las funciones PL/pgSQL» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Conceptos básicos de las funciones PL/pgSQL»?
Escriba funciones PL/pgSQL con parámetros, RETURNS TABLE, flujo de control (IF, LOOP, FOREACH) y gestión de excepciones. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Conceptos básicos de las funciones PL/pgSQL»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Anatomía de los triggers: BEFORE/AFTER, FOR EACH ROW
- Conceptos básicos de las funciones PL/pgSQL
- Bloques DO y código anónimo
- Auditoría de tablas con triggers