restock_procedure.sql en SQL
Una reposición nocturna: encontrar estantes bajos, rellenar y confirmar sobre la marcha.
-- A nightly restock: walk the low shelves, top up, commit as you go.
CREATE TABLE restock_log (
sku TEXT NOT NULL,
added INTEGER NOT NULL,
logged_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE PROCEDURE restock(threshold INTEGER, top_up INTEGER)
LANGUAGE plpgsql
AS $$
DECLARE
item RECORD;
touched INTEGER := 0;
BEGIN
FOR item IN
SELECT sku, stock
FROM products
WHERE stock < threshold
ORDER BY stock
LOOP
UPDATE products
SET stock = stock + top_up
WHERE sku = item.sku;
INSERT INTO restock_log (sku, added)
VALUES (item.sku, top_up);
touched := touched + 1;
COMMIT;
END LOOP;
RAISE NOTICE 'restocked % products', touched;
END;
$$;
CALL restock(threshold => 5, top_up => 10);
SELECT r.sku, r.added, p.stock
FROM restock_log AS r
JOIN products AS p ON p.sku = r.sku
ORDER BY r.sku;
Cómo funciona
- El recorrido
FOR ... IN SELECTencuentra productos bajo el umbral. - Cada pasada actualiza stock, registra la entrega y confirma su lote con
COMMIT. CALL restock(threshold => 5, top_up => 10)lo corre con argumentos con nombre.
Palabras clave y builtins usados aquí
ASBEGINBYCALLCOMMITCREATEDECLAREDEFAULTENDFORFROMININSERTINTEGERINTOJOINLANGUAGENOTNULLONORDERPROCEDURESELECTSETTABLETEXTUPDATEVALUESWHERE
El intento, en números
- Líneas
- 38
- Caracteres a escribir
- 785
- Tokens
- 171
- Ritmo de tres estrellas
- 65 tpm
Al ritmo de tres estrellas de 65 tokens por minuto, este intento toma unos 158 segundos.
Paso 2 de 3 en Bis; paso 22 de 23 en Procedimientos almacenados de PostgreSQL.