Introducció
En aquest tema, explorarem els procediments i funcions emmagatzemades en PostgreSQL. Aquestes eines són fonamentals per encapsular la lògica de negoci dins de la base de dades, permetent una major reutilització del codi i una millor organització de les operacions complexes.
Conceptes clau
Procediments emmagatzemats
- Definició: Un procediment emmagatzemat és un conjunt de sentències SQL que es poden executar com una unitat. Els procediments poden acceptar paràmetres d'entrada i retornar valors.
- Ús: S'utilitzen per realitzar operacions repetitives, com ara actualitzacions massives, càlculs complexos o tasques administratives.
Funcions emmagatzemades
- Definició: Una funció emmagatzemada és similar a un procediment, però està dissenyada per retornar un valor. Les funcions poden ser invocades des de sentències SQL.
- Ús: S'utilitzen per encapsular càlculs que es poden reutilitzar en diverses consultes, com ara càlculs financers o transformacions de dades.
Creant Procediments Emmagatzemats
Sintaxi bàsica
CREATE PROCEDURE nom_procediment (paràmetres) LANGUAGE plpgsql AS $$ BEGIN -- Codi del procediment END; $$;
Exemple pràctic
Crearem un procediment que actualitza el salari d'un empleat en funció del seu ID.
CREATE PROCEDURE update_salary(emp_id INT, new_salary NUMERIC) LANGUAGE plpgsql AS $$ BEGIN UPDATE employees SET salary = new_salary WHERE id = emp_id; END; $$;
Executant el procediment
Creant Funcions Emmagatzemades
Sintaxi bàsica
CREATE FUNCTION nom_funció (paràmetres) RETURNS tipus_de_retorn LANGUAGE plpgsql AS $$ BEGIN -- Codi de la funció RETURN valor; END; $$;
Exemple pràctic
Crearem una funció que calcula el salari anual d'un empleat en funció del seu salari mensual.
CREATE FUNCTION annual_salary(monthly_salary NUMERIC) RETURNS NUMERIC LANGUAGE plpgsql AS $$ BEGIN RETURN monthly_salary * 12; END; $$;
Utilitzant la funció
Exercicis pràctics
Exercici 1: Crear un procediment per eliminar un empleat
Descripció: Crea un procediment emmagatzemat que elimini un empleat de la taula employees
en funció del seu ID.
Solució:
CREATE PROCEDURE delete_employee(emp_id INT) LANGUAGE plpgsql AS $$ BEGIN DELETE FROM employees WHERE id = emp_id; END; $$;
Exercici 2: Crear una funció per calcular el descompte
Descripció: Crea una funció que calculi el preu final d'un producte després d'aplicar un descompte. La funció ha de rebre el preu original i el percentatge de descompte.
Solució:
CREATE FUNCTION calculate_discount(price NUMERIC, discount_percent NUMERIC) RETURNS NUMERIC LANGUAGE plpgsql AS $$ BEGIN RETURN price - (price * discount_percent / 100); END; $$;
Executant la funció
Errors comuns i consells
- Error de sintaxi: Assegura't de tancar correctament les sentències SQL amb
;
i utilitzar els delimitadors correctes ($$
). - Tipus de dades incorrectes: Verifica que els tipus de dades dels paràmetres i els valors retornats siguin correctes.
- Manca de permisos: Assegura't que l'usuari que executa el procediment o la funció tingui els permisos necessaris per accedir a les taules i modificar-les.
Conclusió
Els procediments i funcions emmagatzemades són eines poderoses per encapsular la lògica de negoci dins de la base de dades. Permeten una major reutilització del codi i una millor organització de les operacions complexes. En els següents temes, explorarem altres funcionalitats avançades de PostgreSQL que complementen l'ús de procediments i funcions emmagatzemades.
Curs de PostgreSQL
Mòdul 1: Introducció a PostgreSQL
Mòdul 2: Operacions bàsiques de SQL
Mòdul 3: Consultes SQL avançades
Mòdul 4: Disseny de bases de dades i normalització
Mòdul 5: Funcionalitats avançades de PostgreSQL
Mòdul 6: Optimització i millora del rendiment
- Optimització de consultes
- Estratègies d'indexació
- Analitzant el rendiment de les consultes
- Vacuuming i manteniment
Mòdul 7: Seguretat i gestió d'usuaris
- Rols d'usuari i permisos
- Mètodes d'autenticació
- Encriptació de dades
- Còpia de seguretat i restauració
Mòdul 8: Treballant amb JSON i funcionalitats NoSQL
Mòdul 9: Extensions i eines avançades
- PostGIS per a dades geoespacials
- Cerca de text complet
- Wrappers de dades externes
- PL/pgSQL i altres llenguatges procedimentals