2011-12-24 10 views
12

Sto cercando di imparare i cursori di base usando PostgreSQL. Questo è il mio script:Cursori PostgreSQL

DECLARE cur_employees CURSOR FOR 
    SELECT * 
    FROM employee 

CLOSE cur_employees 

Voglio attraversare la lista e produrre quelli che sono attivi. Dove dovrei iniziare?

+1

Inizia aggiungendo una clausola WHERE selezionando quelle attive. – aib

+2

Leggere il [capitolo sui cursori nel manuale] (http://www.postgresql.org/docs/9.1/interactive/plpgsql-cursors.html). –

+0

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

risposta

24

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.

+4

+1 Risposta di alta qualità ancora una volta. –

+1

E ricorda che il 90% di quello che le persone cercano di utilizzare per i cusors sarebbe meglio gestito con operazioni basate su set. Non dovresti mai pensare di eseguire il ciclo di un set di dati e nessuno, ad eccezione di un dba esperto, dovrebbe prendere in considerazione la possibilità di scrivere un cursore. Questa è una tecnica che non dovresti imparare fino a quando non sei molto anziano e sai quando è appropriato. Se stai semplicemente imparando SQl, salta questo per circa dieci anni. – HLGEM

0

Generalmente, uno ha un DECLARE per il cursore, quindi un OPEN del cursore (che materializza il set di risultati), più operazioni FETCH per recuperare le righe dall'insieme di risultati singolarmente, e quindi si esegue un CLOSE del cursore .

Sembra che ci sia un DECLARE seguito da un CLOSE. Quindi il tuo errore di sintassi, come non hai mai fatto un APERTO.

+0

Hm. Karl non ha menzionato se vuole usare i cursori con SQL o con pl/pgsql.Per SQL non c'è 'OPEN', perché questo è implicitamente fatto da' DECLARE'. –

Problemi correlati