Un cursore può essere esplicito o implicito ed entrambi i tipi possono essere utilizzati in un ciclo FOR. Ci sono davvero due aspetti della tua domanda.
Perché utilizzare un ciclo FOR cursore esplicito su un ciclo FOR cursore implicito?
- Utilizzare un ciclo FOR cursore esplicito quando la query verrà riutilizzata, altrimenti si preferisce un cursore implicito.
Perché usare un loop con un FETCH anziché un ciclo FOR che non ha un FETCH esplicito?
- Utilizzare un FETCH all'interno di un ciclo quando è necessario eseguire la raccolta collettiva o quando è necessario SQL dinamico.
Ecco alcune informazioni utili dalla documentazione.
Esempio di cursore implicito FOR LOOP
BEGIN
FOR vItems IN (
SELECT last_name
FROM employees
WHERE manager_id > 120
ORDER BY last_name
)
LOOP
DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
END LOOP;
END;
/
Esempio di cursore esplicito FOR LOOP
DECLARE
CURSOR c1 IS
SELECT last_name
FROM employees
WHERE manager_id > 120
ORDER BY last_name;
BEGIN
FOR vItems IN c1 LOOP
DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
END LOOP;
END;
/
Cursore implicito
Un cursore implicito è un cursore di sessione creato e gestito da PL / SQL. PL / SQL apre un cursore implicito ogni volta che si esegue un'istruzione SELECT o DML. Non puoi controllare un cursore implicito, ma puoi ottenere informazioni dai suoi attributi.
Un cursore implicito si chiude dopo l'esecuzione dell'istruzione associata; tuttavia, i valori dei suoi attributi rimangono disponibili fino a quando non viene eseguita un'altra istruzione SELECT o DML.
Gli attributi del cursore implicito sono: SQL% ISOPEN, SQL% FOUND, SQL% NOTFOUND, SQL% ROWCOUNT, SQL% BULK_ROWCOUNT, SQL% BULK_EXCEPTIONS
Cursore esplicito
Un cursore esplicito è un cursore di sessione che costruisci e gestisci. È necessario dichiarare e definire un cursore esplicito, assegnandogli un nome e associandolo a una query (in genere, la query restituisce più righe). Quindi è possibile elaborare il set di risultati della query in uno dei seguenti modi:
Aprire il cursore esplicito (con l'istruzione OPEN), recuperare le righe dal set di risultati (con l'istruzione FETCH) e chiudere il cursore esplicito (con l'istruzione CLOSE).
Utilizzare il cursore esplicito in un'istruzione FOR LOOP del cursore (consultare "Elaborazione del set di risultati della query con istruzioni cursore FOR LOOP").
Non è possibile assegnare un valore a un cursore esplicito, utilizzarlo in un'espressione o utilizzarlo come parametro di sottoprogramma formale o variabile host. Puoi fare queste cose con una variabile cursore (vedi "Variabili cursore").
A differenza di un cursore implicito, è possibile fare riferimento a un cursore esplicito o a una variabile cursore in base al nome. Pertanto, un cursore esplicito o una variabile cursore viene chiamato cursore denominato.
Dichiarazioni cursore per LOOP
Il cursore FOR LOOP consente di eseguire un'istruzione SELECT e di scorrere immediatamente le righe del set di risultati. Questa affermazione può usare un cursore implicito o esplicito.
FOR
è solo un altro modo di usare i cursori. Vedi i documenti: docs.oracle.com/cd/E11882_01/appdev.112/e10472/… Comunque, cosa fa htp.prn ()?