0Pricing
SQL Academy · Lección

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);   -- 5

Variables

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 | cnt

Gestió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

  1. Anatomía de los triggers: BEFORE/AFTER, FOR EACH ROW
  2. Conceptos básicos de las funciones PL/pgSQL
  3. Bloques DO y código anónimo
  4. Auditoría de tablas con triggers
← Volver a SQL Academy