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
