Cursore come tipo di ritorno in Oracle

A volte nasce l’esigenza di utilizzare una funzione che ritorna un cursore. Basti pensare ad un package centralizzato che gestisce funzionalita’ comuni. Il problema nasce nel momento in cui si voglia fare manutenzione al package comune senza dover modificare chi lo utilizza. Come dobbiamo comportarci con i tipi? Come definiamo la variabile che contiene il cursore di ritorno dalla funzione se tale cursore e’ una join di piu’ tabelle (quindi non possimo fare nome_tabella%rowtype), puo’ variare (per evoluzioni/correzioni) ed e’ dentro una funzione (quindi non possimo fare nome_cursore%rowtype)?

La risposta in breve e’: basta definire un tipo che sara’ il tipo della variabile che conterra’ il cursore e lo stesso tipo sara’ il tipo di ritorno della funzione. Nello specifico:

nell’header del PACKAGE comune definiamo un tipo record:

  1. TYPE ty_tipo_ritorno_rec IS RECORD (
  2. nome       varchar2(100),
  3. cognome    varchar2(100),
  4. dt_nasc    date,
  5. dt_ult_mod date
  6. );

Quindi definiamo subito un’altro tipo che sara’ un cursore generico fatto pero’ come il record appena descritto sopra.

  1. TYPE ty_cursore_ritorno IS REF CURSOR RETURN ty_tipo_ritorno_rec;

La funzione del package comune che ritorna il cursore sara’ cosi’ definita:

  1. FUNCTION get_utente(p_cognome IN VARCHAR2)
  2. RETURN ty_cursore_ritorno IS
  3. /*variabile di ritorno*/
  4. v_result ty_cursore_ritorno;
  5. BEGIN
  6. OPEN v_result FOR
  7. SELECT
  8. U.NOME
  9. ,U.COGNOME
  10. ,U.DT_NASC
  11. ,M.DT_ULT_MOD
  12. FROM UTENTE U
  13. ,MODIFICHE M
  14. WHERE U.ID_UTENTE = M.ID_UTENTE
  15. AND U.COGNOME = p_cognome;
  16. RETURN v_result;
  17. END;

Il package chiamante che utilizza la funzione definita sopra sara’ cosi’ fatto:

definiamo due variabili, una per il tipo cursore di ritorno e l’altra per

fare il fetch delle righe:

  1. v_cursor SCHEMA.NOME_PACKAGE_COMUNE.ty_cursore_ritorno;
  2. v_cursor_rec SCHEMA.NOME_PACKAGE_COMUNE.ty_tipo_ritorno_rec;

quindi faremo:

  1. v_cursor := SCHEMA.NOME_PACKAGE_COMUNE.get_utente('ROSSI');
  2. LOOP
  3. FETCH v_cursor INTO v_cursor_rec;
  4. /*facciamo le operazioni che ci servono*/
  5. dbms_output.put_line (v_cursor.nome);
  6. EXIT WHEN v_cursor%NOTFOUND;
  7. END LOOP;
  8. CLOSE v_cursor;

Questo ci porta un notevole vantaggio: se il cursore del package comune viene ampliato per far fronte a nuove esigenze, al chiamante il cambiamento e’ trasparente.

L’unica cosa da fare per l’eventuale modifica del cursore e’ l’allineamento del tipo ty_tipo_ritorno_rec con i nuovi campi aggiunti/tolti.

Fonte: [Oracle] – Cursore come tipo di ritorno

You can leave a response, or trackback from your own site.

3 Responses to “Cursore come tipo di ritorno in Oracle”

  1. diggita.it scrive:

    Cursore come tipo di ritorno in Oracle…

    A volte nasce l’esigenza di utilizzare una funzione che ritorna un cursore. Basti pensare ad un package centralizzato che gestisce funzionalita’ comuni. Il problema nasce nel momento in cui si voglia fare manutenzione al package comune senza dover …

  2. Denise scrive:

    Ciao! Scusami ma non riesco a capire dove mettere la dichiarazione della variabile “ty_cursore_ritorno” puoi darmi una mano?
    Grazie

  3. admin scrive:

    Ciao Denise, “ty_cursore_ritorno” è un cursore generico dello stesso tipo di “ty_tipo_ritorno_rec”. Per questo motivo deve essere dichiarato rigorosamente dopo la dichiarazione del record
    TYPE ty_tipo_ritorno_rec IS RECORD (
    ….
    )
    in modo tale da poter ereditare le sue proprietà.
    Tutto chiaro?

Leave a Reply

Subscribe to RSS Feed Follow me on Twitter!