COMMIT dentro de un procedimiento en SQL
Solo los procedimientos pueden confirmar a mitad de camino, soltando el trabajo por lotes.
-- Only procedures may COMMIT mid-run, releasing work batch by batch.
CREATE PROCEDURE archive_canceled()
LANGUAGE plpgsql
AS $$
DECLARE
doomed RECORD;
BEGIN
FOR doomed IN
SELECT id
FROM orders
WHERE status = 'canceled'
LOOP
UPDATE orders
SET status = 'archived'
WHERE id = doomed.id;
COMMIT;
END LOOP;
END;
$$;
CALL archive_canceled();
SELECT id, status
FROM orders
WHERE status = 'archived';
Cómo funciona
- El bucle
FOR ... IN SELECTvisita cada pedido cancelado. - Cada pasada archiva un pedido y hace
COMMITantes de la siguiente. - Un fallo a mitad de corrida conserva cada lote ya confirmado — el punto del patrón.
Palabras clave y builtins usados aquí
ASBEGINCALLCOMMITCREATEDECLAREENDFORFROMINLANGUAGEPROCEDURESELECTSETUPDATEWHERE
El intento, en números
- Líneas
- 25
- Caracteres a escribir
- 395
- Tokens
- 67
- Ritmo de tres estrellas
- 65 tpm
Al ritmo de tres estrellas de 65 tokens por minuto, este intento toma unos 62 segundos.
Paso 3 de 4 en Procedimientos y transacciones; paso 11 de 23 en Procedimientos almacenados de PostgreSQL.