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

Come restituire un set di risultati/cursore da un blocco anonimo Oracle PL/SQL che esegue Dynamic SQL?

Puoi scrivere una funzione PL/SQL per restituire quel cursore (o potresti mettere quella funzione in un pacchetto se hai più codice relativo a questo):

CREATE OR REPLACE FUNCTION get_allitems
  RETURN SYS_REFCURSOR
AS
  my_cursor SYS_REFCURSOR;
BEGIN
  OPEN my_cursor FOR SELECT * FROM allitems;
  RETURN my_cursor;
END get_allitems;

Questo restituirà il cursore.

Assicurati di non inserire il tuo SELECT -Inserisci tra virgolette in PL/SQL quando possibile. Metterlo in stringhe significa che non può essere controllato in fase di compilazione e che deve essere analizzato ogni volta che lo usi.

Se hai davvero bisogno di usare SQL dinamico puoi mettere la tua query tra virgolette singole:

  OPEN my_cursor FOR 'SELECT * FROM allitems';

Questa stringa deve essere analizzata ogni volta che viene chiamata la funzione, che di solito è più lenta e nasconde gli errori nella query fino al runtime.

Assicurati di utilizzare le variabili di collegamento ove possibile per evitare analisi difficili:

  OPEN my_cursor FOR 'SELECT * FROM allitems WHERE id = :id' USING my_id;