Files
2025-12-17 13:02:12 +01:00

4.0 KiB

Tipi Custom Database

Questa cartella contiene la documentazione di tutti i 10 tipi custom del database (esclusi i tipi PLJSON).

Tipi per Funzioni Pipelined

Questi tipi sono utilizzati dalle funzioni che ritornano tabelle (pipelined functions).

F_GET_OSPITI

Tipo Descrizione
T_DET_OSPITI_ROW Tipo OBJECT per singola riga
T_DET_OSPITI_TAB Tipo TABLE OF T_DET_OSPITI_ROW
-- Struttura T_DET_OSPITI_ROW
CREATE TYPE T_DET_OSPITI_ROW AS OBJECT (
    ID_EVENTO      NUMBER,
    TOT_ADULTI     NUMBER,
    TOT_KINDER     NUMBER,
    TOT_BABY       NUMBER,
    TOT_STAFF      NUMBER,
    TOT_INVITATI   NUMBER,
    NOTE_ADULTI    VARCHAR2(1000),
    NOTE_KINDER    VARCHAR2(1000),
    NOTE_BABY      VARCHAR2(1000),
    NOTE_STAFF     VARCHAR2(1000)
);

-- Struttura T_DET_OSPITI_TAB
CREATE TYPE T_DET_OSPITI_TAB AS TABLE OF T_DET_OSPITI_ROW;

F_REP_ALLESTIMENTI

Tipo Descrizione
T_REP_ALLESTIMENTI_ROW Tipo OBJECT per singola riga
T_REP_ALLESTIMENTI_TAB Tipo TABLE OF T_REP_ALLESTIMENTI_ROW

F_REP_CUCINA

Tipo Descrizione
T_REP_CUCINA_ROW Tipo OBJECT per singola riga
T_REP_CUCINA_TAB Tipo TABLE OF T_REP_CUCINA_ROW

Tipi Utility

Tipo Descrizione
STRING_LIST Tipo TABLE OF VARCHAR2 per liste stringhe
ENUM_TABLE_OBJECT Tipo OBJECT per STRING_TO_TABLE_ENUM
ENUM_TABLE_TYPE Tipo TABLE OF ENUM_TABLE_OBJECT
XLIB_VC2_ARRAY_T Array di VARCHAR2 per XLIB

Utilizzo in Query

-- Esempio uso F_GET_OSPITI
SELECT * FROM TABLE(F_GET_OSPITI(123));

-- Esempio uso STRING_TO_TABLE_ENUM
SELECT * FROM TABLE(STRING_TO_TABLE_ENUM('A:B:C', 0, ':'));

Migrazione .NET

In .NET i tipi Oracle pipelined vengono sostituiti con classi DTO e IEnumerable/IAsyncEnumerable.

Esempio T_DET_OSPITI_ROW → DTO

public class DettaglioOspitiDto
{
    public int IdEvento { get; set; }
    public int TotAdulti { get; set; }
    public int TotKinder { get; set; }
    public int TotBaby { get; set; }
    public int TotStaff { get; set; }
    public int TotInvitati { get; set; }
    public string NoteAdulti { get; set; }
    public string NoteKinder { get; set; }
    public string NoteBaby { get; set; }
    public string NoteStaff { get; set; }
}

Esempio F_GET_OSPITI → Metodo Service

public async Task<DettaglioOspitiDto> GetOspitiAsync(int idEvento)
{
    var ospiti = await _context.EventiDetOspiti
        .Where(o => o.IdEvento == idEvento)
        .ToListAsync();

    return new DettaglioOspitiDto
    {
        IdEvento = idEvento,
        TotAdulti = ospiti.FirstOrDefault(o => o.CodTipoOspite == "8")?.Numero ?? 0,
        TotKinder = ospiti.FirstOrDefault(o => o.CodTipoOspite == "5")?.Numero ?? 0,
        TotBaby = ospiti.FirstOrDefault(o => o.CodTipoOspite == "6")?.Numero ?? 0,
        TotStaff = ospiti.FirstOrDefault(o => o.CodTipoOspite == "7")?.Numero ?? 0,
        TotInvitati = ospiti.Sum(o => o.Numero ?? 0),
        NoteAdulti = ospiti.FirstOrDefault(o => o.CodTipoOspite == "8")?.Note,
        NoteKinder = ospiti.FirstOrDefault(o => o.CodTipoOspite == "5")?.Note,
        NoteBaby = ospiti.FirstOrDefault(o => o.CodTipoOspite == "6")?.Note,
        NoteStaff = ospiti.FirstOrDefault(o => o.CodTipoOspite == "7")?.Note
    };
}

Esempio STRING_TO_TABLE_ENUM → Extension Method

public static class StringExtensions
{
    public static IEnumerable<string> ToTableEnum(this string input, char delimiter = ':')
    {
        if (string.IsNullOrEmpty(input))
            yield break;
            
        foreach (var item in input.Split(delimiter))
        {
            yield return item.Trim();
        }
    }
}

// Uso
var items = "A:B:C".ToTableEnum(':');