Oracle PL/SQL: implicit vs explicit cursors

PL / SQL emette un cursore implicito ogni volta che si esegue un’istruzione SQL direttamente nel codice, a condizione che tale codice non utilizzi un cursore esplicito. Viene chiamato cursore “implicito” perché non si dichiara esplicitamente un cursore per l’istruzione SQL.

Se utilizzi un cursore implicito, Oracle esegue automaticamente le operazioni di apertura, recupero e chiusura; queste azioni sono al di fuori del tuo controllo programmatico. Tuttavia, è possibile ottenere informazioni sull’istruzione SQL eseguita più di recente esaminando i valori negli attributi del cursore SQL impliciti, come spiegato più avanti in questo capitolo.

Il cursore implicito è più semplice da codificare, ma soffre di:

  • inefficienza (lo standard ANSI specifica che deve essere recuperato due volte per verificare se ce n’è più di uno disco)

  • vulnerabilità agli errori dei dati (se si ottengono due righe, si solleva un’eccezione TOO_MANY_ROWS)

    Esempio di cursore implicito:

SELECT col INTO var FROM table WHERE ….. ;

Un cursore esplicito è un’istruzione SELECT esplicitamente definita nella sezione della dichiarazione del codice e, nel processo, assegnata a un nome. Non esiste un cursore esplicito per le istruzioni UPDATE, DELETE e INSERT.

Con i cursori espliciti, hai il controllo completo su come accedere alle informazioni nel database. Decidi tu quando APRIRE il cursore, quando FETCH i record dal cursore (e quindi dalla tabella o dalle tabelle nell’istruzione SELECT del cursore) quanti record prelevare e quando CHIUDERE il cursore. Le informazioni sullo stato corrente del cursore sono disponibili attraverso l’esame degli attributi del cursore. Questa granularità del controllo rende il cursore esplicito uno strumento inestimabile per il tuo impegno di sviluppo.

Esempio:
DECLARE
CURSOR cur IS SELECT col FROM table WHERE … ;
BEGIN
OPEN cur;
FETCH cur INTO var;
CLOSE cur;
END;

Potrebbero interessarti anche...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *