Molto raramente si desidera utilizzare in modo esplicito i cursori in PostgreSQL, anche durante l'elaborazione dei risultati della query in plpgsql. Questo è un netto contrasto rispetto a molti altri database SQL in cui vengono utilizzati quasi sempre.
In plpgsql si potrebbe semplicemente scrivere qualcosa di simile:
DECLARE
emp employee%rowtype;
BEGIN
FOR emp IN SELECT * FROM employee LOOP
IF emp.active THEN
RAISE INFO 'Active: %', emp.employee_id
END IF;
END LOOP;
END
In quanto sopra, le plpgsql offerte dei gestori di lingua con apertura, di legame, il recupero e la stessa chiusura (più declarations e control structures).
Con PostgreSQL dalla 9.0, è possibile semplicemente eseguire l'esecuzione di plpgsql utilizzando un blocco "DO". Per le versioni precedenti, è necessario creare una funzione e selezionarla. Se stai cercando l'equivalente PostgreSQL di, ad esempio, iterando attraverso un risultato con un cursore su SQL Server, è quello che è. Si noti che l'iterazione ecc. È non parte del dialetto SQL, solo parte di plpgsql (o di uno qualsiasi degli altri linguaggi incorporati).
La sintassi "DICHIARARE CURSORE xxx" a livello di SQL può essere utilizzato in questo modo:
DECLARE cur_employees CURSOR FOR SELECT * FROM employee;
FETCH NEXT FROM cur_employees;
// etc..
CLOSE cur_employees;
Questo può essere usato per ottenere attenzione solo una parte del set di risultati della query. Tuttavia, è insolito utilizzarli, poiché in genere il driver client fornisce una sorta di funzionalità per eseguire questa operazione (ad esempio set di risultati scorrevoli in JDBC). È anche possibile restituire i cursori da funzioni simili a Oracle, anche se si tratta di un caso di utilizzo relativamente raro.
Inizia aggiungendo una clausola WHERE selezionando quelle attive. – aib
Leggere il [capitolo sui cursori nel manuale] (http://www.postgresql.org/docs/9.1/interactive/plpgsql-cursors.html). –
Ho fatto come mi hai detto: DICHIARARE cur_employees del cursore per SELECT * FROM dipendente dove 'attivi' cur_employees close = attivi ma sto ottenendo il seguente errore: – Karl