En aquest tema, explorarem les millors pràctiques per escriure codi PL/SQL eficient, mantenible i segur. Seguir aquestes recomanacions t'ajudarà a evitar errors comuns i a millorar la qualitat del teu codi.
- Escriptura de codi clar i llegible
1.1. Utilitza noms descriptius
- Variables: Utilitza noms de variables que descriguin clarament el seu propòsit.
- Procediments i funcions: Els noms han de reflectir l'acció que realitzen.
Exemple:
-- Noms de variables clars DECLARE v_total_sales NUMBER; v_employee_name VARCHAR2(50); BEGIN -- Codi aquí END;
1.2. Comentaris adequats
- Comentaris en línia: Explica el propòsit de línies específiques de codi.
- Comentaris de bloc: Proporciona una visió general de seccions més grans de codi.
Exemple:
DECLARE v_total_sales NUMBER; BEGIN -- Calcula les vendes totals per a l'any actual SELECT SUM(sales_amount) INTO v_total_sales FROM sales WHERE sales_date BETWEEN TO_DATE('01-JAN-2023', 'DD-MON-YYYY') AND TO_DATE('31-DEC-2023', 'DD-MON-YYYY'); -- Mostra el resultat DBMS_OUTPUT.PUT_LINE('Total Sales: ' || v_total_sales); END;
- Estructura i organització del codi
2.1. Utilitza blocs anidats amb cura
- Evita l'ús excessiu de blocs anidats per mantenir el codi llegible.
Exemple:
2.2. Divideix el codi en procediments i funcions
- Encapsula la lògica en procediments i funcions per a una millor reutilització i mantenibilitat.
Exemple:
CREATE OR REPLACE PROCEDURE calculate_total_sales IS v_total_sales NUMBER; BEGIN SELECT SUM(sales_amount) INTO v_total_sales FROM sales WHERE sales_date BETWEEN TO_DATE('01-JAN-2023', 'DD-MON-YYYY') AND TO_DATE('31-DEC-2023', 'DD-MON-YYYY'); DBMS_OUTPUT.PUT_LINE('Total Sales: ' || v_total_sales); END calculate_total_sales;
- Gestió d'errors
3.1. Utilitza blocs d'excepcions
- Gestiona les excepcions per evitar que el programa falli inesperadament.
Exemple:
BEGIN -- Codi que pot generar una excepció EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No data found.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM); END;
3.2. Registra els errors
- Utilitza taules de registre o eines de registre per mantenir un historial d'errors.
Exemple:
CREATE OR REPLACE PROCEDURE log_error(p_error_message VARCHAR2) IS BEGIN INSERT INTO error_log (error_message, log_date) VALUES (p_error_message, SYSDATE); COMMIT; END log_error;
- Optimització del rendiment
4.1. Utilitza col·leccions i operacions en massa
- Redueix el nombre de commutacions de context entre PL/SQL i SQL utilitzant col·leccions i operacions en massa.
Exemple:
DECLARE TYPE sales_table_type IS TABLE OF sales%ROWTYPE; v_sales_table sales_table_type; BEGIN SELECT * BULK COLLECT INTO v_sales_table FROM sales; FORALL i IN v_sales_table.FIRST..v_sales_table.LAST INSERT INTO sales_archive VALUES v_sales_table(i); END;
4.2. Evita les consultes innecessàries
- Minimitza el nombre de consultes SQL dins de bucles PL/SQL.
Exemple:
DECLARE v_total_sales NUMBER; BEGIN -- Consulta única fora del bucle SELECT SUM(sales_amount) INTO v_total_sales FROM sales WHERE sales_date BETWEEN TO_DATE('01-JAN-2023', 'DD-MON-YYYY') AND TO_DATE('31-DEC-2023', 'DD-MON-YYYY'); FOR i IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE('Total Sales: ' || v_total_sales); END LOOP; END;
- Seguretat
5.1. Evita la injecció SQL
- Utilitza variables d'enllaç per evitar la injecció SQL.
Exemple:
DECLARE v_employee_id NUMBER := 101; v_employee_name VARCHAR2(50); BEGIN -- Utilitza una variable d'enllaç SELECT employee_name INTO v_employee_name FROM employees WHERE employee_id = v_employee_id; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name); END;
5.2. Controla els permisos d'accés
- Assegura't que només els usuaris autoritzats tinguin accés a procediments i funcions sensibles.
Exemple:
Conclusió
Seguir aquestes millors pràctiques t'ajudarà a escriure codi PL/SQL més eficient, segur i fàcil de mantenir. Recorda que la claredat i la seguretat són tan importants com el rendiment. Amb aquestes tècniques, estaràs millor preparat per afrontar projectes complexos i garantir la qualitat del teu codi.
Curs de PL/SQL
Mòdul 1: Introducció a PL/SQL
Mòdul 2: Fonaments de PL/SQL
- Estructura del bloc PL/SQL
- Variables i tipus de dades
- Estructures de control
- Cursors
- Gestió d'excepcions