2016-05-25 39 views
5

Nella documentazione here, il seguente esempio di codice è dato per l'utilizzo di un cursor:Cursori Firebird - Perché dovresti usare uno

execute block 
returns (
    relation char(31), 
    sysflag int) 
as 
declare cur cursor for 
    (select rdb$relation_name, rdb$system_flag from rdb$relations); 
begin 
    open cur; 
    while (1=1) do 
    begin 
    fetch cur into relation, sysflag; 
    if (row_count = 0) then leave; 
    suspend; 
    end 
    close cur; 
end 

Ma questo può essere fatto anche nel modo seguente:

execute block 
returns (
    relation char(31), 
    sysflag int) 
as 
begin 
    for select rdb$relation_name, rdb$system_flag 
    from rdb$relations 
    into relation, sysflag 
    do begin 
    suspend; 
    end 
end 

Quindi, perché dovrei volerne usare uno? In definitiva l'esempio sopra non ha nemmeno bisogno di execlute block in quanto è solo una semplice istruzione select. Quindi suppongo che l'esempio sia troppo semplice per mostrare un vantaggio di questo.

+0

La versione corrente della documentazione contiene un esempio un po 'più complesso: http://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-coding.html#fblangref25-psql- declare-cursor –

risposta

2

La documentazione si collega a (e la sua newer 2.5 counterpart) già include la maggior parte dei motivi per cui si dovrebbe (o non voleva) utilizzare un cursore (sottolineatura mia):

Se il cursore è necessario solo a piedi il set di risultati, , è quasi sempre più facile e meno soggetto a errori nell'uso di una dichiarazione FOR SELECT con la clausola AS CURSOR. I cursori dichiarati devono essere esplicitamente aperti, utilizzati per recuperare i dati e chiusi. La variabile di contesto ROW_COUNT deve essere controllata dopo ogni recupero e, se il suo valore è zero, il ciclo deve essere terminato. Una dichiarazione FOR SELECT controlla automaticamente.

Tuttavia, i cursori dichiarati forniscono un elevato livello di controllo sugli eventi sequenziali e consentono la gestione di più cursori in parallelo.

Così, in breve, di solito si dovrebbe usare FOR SELECT, tranne quando è necessario accedere a più cursori allo stesso tempo, o forse bisogno di qualche logica più complicato di un semplice ciclo. Rende anche possibile riutilizzare la stessa definizione del cursore in più parti del codice (anche se ciò potrebbe indicare che è necessario suddividere il codice in più stored procedure).

La presenza di uno strumento non significa che dovrebbe essere utilizzata per tutto.

Come parte a parte, un FOR SELECT è anche un cursore, tranne che non si dispone di un controllo esplicito su di esso (si nasconde la maggior parte della bruttezza;)).

1

Un'altra situazione che si potrebbe utilizzare con cursori è quando è necessario aggiornare le righe recuperate e trovare o riposizionare (determinando la clausola WHERE esatta) le righe potrebbero essere un problema. In questo caso, è possibile aprire i cursori con la clausola FOR UPDATE e aggiornare (o eliminare) le righe utilizzando la clausola WHERE CURRENT OF.

+0

Grazie, è un buon punto. – Paul