Oracle
 sql >> Database >  >> RDS >> Oracle

Restituisce righe di dati da un blocco pl/sql

Un blocco anonimo non può restituire nulla. È possibile assegnare valori a una variabile di collegamento, incluso un tipo di raccolta o un cursore di riferimento, all'interno del blocco. Ma la collezione dovrebbe essere definita, oltre che dichiarata, fuori dal blocco. Cioè, dovrebbe essere un tipo che puoi usare in semplice SQL, non qualcosa definito in PL/SQL. Al momento stai usando un tipo PL/SQL definito all'interno del blocco e anche una variabile dichiarata all'interno del blocco, quindi è fuori dall'ambito del client e non sarebbe nemmeno un tipo valido al di fuori di esso . (Inoltre non ha bisogno di essere inizializzato, ma questo è un problema minore).

A seconda di come verrà effettivamente consumato, un'opzione consiste nell'usare un cursore di riferimento e puoi dichiararlo e visualizzarlo tramite SQL*Plus o SQL Developer con la variable e print comandi. Ad esempio:

variable rc sys_refcursor

begin
  open :rc for ( select ... /* your cursor statement */ );
end;
/

print rc

Puoi fare qualcosa di simile da un'applicazione client, ad es. avere una funzione che restituisce un cursore di riferimento o una procedura con un parametro out che è un cursore di riferimento e associarlo dall'applicazione. Quindi scorrere sul cursore di riferimento come set di risultati. Ma i dettagli dipendono dalla lingua utilizzata dall'applicazione.

Un'altra opzione è avere una funzione pipeline che restituisca un tipo di tabella, sempre definita a livello SQL (con create type ) non in PL/SQL, che potrebbe consumare meno risorse di una raccolta restituita in una volta sola.

Ma dovrei chiedermi perché lo stai facendo. Hai detto che "scavare i batch successivi richiede molto più tempo", il che sembra che tu stia utilizzando un meccanismo di paging nella tua query, generando un numero di riga e quindi selezionando un intervallo di 100 all'interno di quello. Se il tuo client/applicazione desidera ottenere tutte le righe, sarebbe più semplice eseguire un'unica query ma recupera il risultato impostato in batch.

Sfortunatamente senza alcuna informazione sull'applicazione questa è solo una speculazione...