««« | »»»
PostgreSQL: cursori e query dinamiche
Con PostgreSQL, vista l’abbondanza di linguaggi che possono essere usati per creare le funzioni, è spesso molto conveniente spostare molta di quella logica che solitamente gira nell’application server direttamente nel database.
Tuttavia, uno dei limiti nell’usare le procedure in PostgreSQL è che i vincoli sui datatype restituiti dalle funzioni sono piuttosto rigidi. In pratica, il sistema deve sapere al momento della compilazione tutti i tipi di valori restituiti. Perciò, o dichiariamo i parametri OUT e nella clausola di return usiamo record, oppure, sempre nella clausola di return usiamo una tabella/view/tipo composito già presente nel catalogo. #
Di solito preferisco la secondo soluzione perché in questo modo si crea una dipendenza esplicita fra la funzione e la tabella/view/tipo composito restituito.
Questo però vuol dire che non possiamo scrivere una funzione generica che possa essere usata su più tabelle. Tuttavia, con i cursori possiamo ottenere praticamente la stessa cosa.
Ad es, basta una funzione come questa:
CREATE OR REPLACE FUNCTION get(IN table_name text) RETURNS refcursor AS $$
BEGIN
OPEN c FOR EXECUTE 'SELECT * FROM ' || quote_ident($1);
RETURN c;
END;
$$ language plpgsql;
per poi:
BEGIN;
SELECT get('table');
FETCH ALL FROM result;
COMMIT;
L’unico svantaggio è il dover aprire sempre una transazione ma mi sembra un prezzo ragionevole.
Per proseguire
Commenti e trackback sono disabilitati.