2009-11-06 13 views
7

Domanda rapida sui cursori (in particolare i cursori Oracle).I cursori del database raccolgono le modifiche ai dati sottostanti?

Diciamo che ho una tabella chiamata "my_table", che ha due colonne, un ID e un nome. Ci sono milioni di righe, ma la colonna del nome è sempre la stringa 'test'.

Ho poi eseguire questo script PL/SQL:

declare 
cursor cur is 
    select t.id, t.name 
    from my_table t 
    order by 1; 
begin 
    for cur_row in cur loop 
    if (cur_row.name = 'test') then 
     dbms_output.put_line('everything is fine!'); 
    else 
     dbms_output.put_line('error error error!!!!!'); 
     exit; 
    end if; 
    end loop; 
end; 
/

se io, mentre questo è in funzione, eseguire questo SQL:

update my_table 
    set name = 'error' 
    where id = <max id>; 
commit; 

sarà il cursore nel blocco PL/SQL raccogliere che modifica e stampa "errore errore errore" e uscire? o non prenderà affatto il cambiamento ... o permetterà anche l'aggiornamento a my_table?

grazie!

+1

Hai un codice, perché non lo si esegue e vedere? –

risposta

11

Un cursore gestisce in modo efficace un SELECT e quindi permette di eseguire iterazioni sopra il set di risultati, che è conservato in una fotografia dello stato DB. Poiché il set di risultati è già stato recuperato, non verrà modificato dall'istruzione UPDATE. (Handling cose altrimenti richiederebbe di ri-eseguire la query ogni volta che il cursore avanzato!)

See:

http://www.techonthenet.com/oracle/cursors/declare.php

+6

Mentre è vero che il cursore non sarà influenzato dalla dichiarazione di aggiornamento, non è il caso che tutti i dati del cursore accesso è stato pre-inverosimile nella memoria. Se così fosse, richiederebbe molto tempo per ottenere la prima riga dal cursore. Quello che succede è che il cursore seleziona i dati "come a" l'SCN che era corrente quando è stato aperto. Ecco perché a volte le query a esecuzione prolungata possono essere errate con un errore "snapshot troppo vecchio". –

+0

Ottimo chiarimento, Tony. Grazie. Aggiornerò la mia risposta di conseguenza. –

+0

per Sybase ASE, a partire da [15.7] (http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36272.1570/html/commands/X11816.htm), è possono dichiarare il cursore iNSENSITIVE che: "specifica che le modifiche dei dati apportate in modo indipendente del cursore non sono visibili al set di risultati del cursore Se non si specifica questo argomento, l'impostazione predefinita è semi_sensitive non è possibile aggiornare un cursore insensitive.". – eric

Problemi correlati