Le sottoprogrammi in SQL sono di due tipi:
CALL/EXEC e non sempre possono essere utilizzate nella parte select.Importante:
Esempio di funzione scalare (PostgreSQL):
CREATE FUNCTION get_tax(amount NUMERIC, rate NUMERIC DEFAULT 0.13) RETURNS NUMERIC AS $$ BEGIN RETURN amount * rate; END; $$ LANGUAGE plpgsql; -- utilizzo: SELECT *, get_tax(price) AS tax FROM product;
Esempio di procedura memorizzata (SQL Server):
CREATE PROCEDURE add_employee(@name NVARCHAR(100), @salary INT, @emp_id INT OUTPUT) AS BEGIN INSERT INTO employees (name, salary) VALUES (@name, @salary); SET @emp_id = SCOPE_IDENTITY(); END; DECLARE @id INT; EXEC add_employee 'John', 100000, @id OUTPUT;
È possibile utilizzare direttamente una procedura memorizzata in SELECT?
Spesso rispondono "sì", ma non è corretto.
Risposta:
EXEC/CALL), mentre le funzioni possono essere utilizzate in SELECT.Storia
Progetto: Sistema di contabilizzazione primario, implementazione di report. Errore: Invece di una funzione, è stata scritta una procedura per calcolare la somma — SELECT non funzionava, è stata necessaria una riscrittura dell'intera logica dei report degli utenti.
Storia
Progetto: Sistema ERP con parametri esterni. Errore: Non è stata assegnata la chiave OUT per la procedura, con il risultato che il cliente non poteva conoscere l'ID della registrazione aggiunta, l'integrazione è "fallita".
Storia
Progetto: Servizio finanziario con calcoli fiscali secondo diverse regole. Errore: Utilizzate una funzione scalare in una query massiva senza test sulla prestazione — la query ha rallentato l'elaborazione della tabella a causa della chiamata riga per riga (piano non ottimizzato).