Regole per i tipi di dati di risultato

I tipi di dati di un risultato sono determinati da regole che vengono applicate agli operandi in un'operazione. Questo argomento spiega quelle regole.

Queste norme si applicano a:
  • Colonne corrispondenti in fullselect di operazioni impostate (UNION, INTERSECT e TRANNE)
  • Espressioni di risultato di un'espressione CASE e le funzioni scalari DECODE e NVL2
  • Argomenti della funzione scalare COALESCE (anche NVL e VALUE)
  • Argomenti delle funzioni scalari GREATEST, LEAST, MAX e MIN
  • Valori di espressione dell'in elenco di un predicato IN
  • Espressioni corrispondenti di una clausola VALUES a più righe
  • Valori di espressione per gli elementi in un costruttore di array
  • Argomenti di un predicato TRA (tranne se i tipi di dati di tutti gli operandi sono numerici)
  • Argomenti per gli intervalli di gruppo di aggregazione nelle specifiche OLAP

Queste regole sono applicate soggette ad altre limitazioni su lunghe stringhe per le varie operazioni.

Seguono le regole che coinvolgono vari tipi di dati. In alcuni casi, una tabella viene utilizzata per mostrare i possibili tipi di dati di risultato. I tipi di dati LONG VARCHAR e LONG VARGRAPHIC continuano ad essere supportati ma sono obsoleti e non consigliati.

Queste tabelle identificano il tipo di dati del risultato, compresa la lunghezza applicabile o la precisione e la scala. Il tipo di risultato è determinato considerando gli operandi. Se c'è più di un paio di operandi, inizia considerando la prima coppia. Questo dà un tipo di risultato che viene considerato con il prossimo operando per determinare il tipo di risultato successivo e così via. L'ultimo tipo di risultato intermedio e l'ultimo operando determinano il tipo di risultato per l'operazione. L'elaborazione delle operazioni viene effettuata da sinistra a destra in modo che i tipi di risultato intermedi siano importanti quando le operazioni vengono ripetute. Per esempio, considerare una situazione che coinvolge:
   CHAR(2) UNION CHAR(4) UNION VARCHAR(3)
La prima coppia risulta in un tipo di tipo di CHAR (4). I valori dei risultati hanno sempre 4 bytes. Il tipo di risultato finale è VARCHAR (4). I valori nel risultato dalla prima operazione UNION avranno sempre una lunghezza di 4.

Stringhe di caratteri

Un valore stringa di carattere è compatibile con un altro valore stringa di carattere. Le stringhe di caratteri includono i tipi di dati di tipo CHAR, VARCHAR e CLOB.

Se un operando è ... E l'altro operando è ... Il tipo di dati del risultato è ...
CHAR (x) CHAR (y) CHAR (z) dove z = max (x, y)
CHAR (x) VARCHAR (y) VARCHAR (z) dove z = max (x, y)
VARCHAR (x) CHAR (y) o VARCHAR (y) VARCHAR (z) dove z = max (x, y)
CLOB (x) CHAR (y), VARCHAR (y) o CLOB (y) CLOB (z) dove z = max (x, y)

La code page della stringa di caratteri del risultato sarà ricavata in base alle regole per le conversioni di stringa.

In un database Unicode, se entrambi gli operandi hanno le unità stringa CODEUNITS32 e la pagina del codice derivato non è 0, le unità di stringa della stringa del carattere risultato sono CODEUNITS32. Se un operando è stato definito con CODEUNITS32, l'altro operando non può essere definito come FOR BIT DATA.Otherwise, le unità di stringa della stringa di caratteri del risultato sono OCTETS. I casi speciali si applicano quando le unità stringa di un operando sono CODEUNITS32 e le unità stringa dell'altro operando sono OCTETS con un attributo di lunghezza che supera il massimo del tipo di dati in CODEUNITS32.
Se un operando è ... E l'altro operando è ... Il tipo di dati del risultato è ...
CHAR (x OCTETS) con x>63 CHAR (y CODEUNITS32) VARCHAR (z CODEUNITS32) dove z = max (x, y)
VARCHAR (x OCTETS) con x>8168 CHAR (y CODEUNITS32) o VARCHAR (y CODEUNITS32) Errore
CLOB (x OCTETS) con x>536870911 CHAR (y CODEUNITS32), VARCHAR (y CODEUNITS32), o CLOB (y CODEUNITS32) CLOB (536870911 CODEUNITS32)

Stringhe grafiche

Un valore stringa grafico è compatibile con un altro valore di stringa grafica. Stringhe grafiche includono i tipi di dati GRAPHIC, VARGRAPHIC e DBCLOB.

Se un operando è ... E l'altro operando è ... Il tipo di dati del risultato è ...
GRAFICA (x) GRAFICA (y) GRAFICA (z) dove z = max (x, y)
VARGRAFICO (x) GRAFICO (y) OR VARGRAFICO (y) VARGRAPHIC (z) dove z = max (x, y)
DBCLOB (x) GRAPHIC (y), VARGRAPHIC (y) o DBCLOB (y) DBCLOB (z) dove z = max (x, y)

La code page della stringa grafica di risultato sarà ricavata in base alle regole per le conversioni di stringa.

In un database Unicode, se entrambi gli operandi hanno le unità stringa CODEUNITS32 e la pagina del codice derivato non è 0, le unità di stringa della stringa del carattere risultato sono CODEUNITS32. Se un operando è stato definito con CODEUNITS32, l'altro operando non può essere definito come FOR BIT DATA.Otherwise, le unità di stringa della stringa di caratteri del risultato sono OCTETS. I casi speciali si applicano quando le unità stringa di un operando sono CODEUNITS32 e le unità stringa dell'altro operando sono OCTETS con un attributo di lunghezza che supera il massimo del tipo di dati in CODEUNITS32. In un database Unicode, se l'operando ha unità stringa CODEUNITS32o CODEUNITS16, le unità stringa della stringa grafica risultante sono CODEUNITS32. Casi speciali si applicano quando le unità stringa di un operando sono CODEUNITS32 e le unità stringa dell'altro operando sono CODEUNITS16 con un attributo di lunghezza che supera il massimo del tipo di dati in CODEUNITS32.
Se un operando è ... E l'altro operando è ... Il tipo di dati del risultato è ...
GRAFICA (x CODEUNITS16) con x>63 GRAFICA (y CODEUNITS32) VARGRAPHIC (z CODEUNITS32) dove z = max (x, y)
VARGRAPHIC (x CODEUNITS16 ) con x>8168 GRAPHIC (y CODEUNITS32) o VARGRAPHIC (y CODEUNITS32) Errore
DBCLOB (x CODEUNITS16 ) con x>536870911 GRAPHIC (y CODEUNITS32), VARGRAPHIC (y CODEUNITS32) o DBCLOB (y CODEUNITS32) DBCLOB (536870911 CODEUNITS32)

Stringhe di carattere e grafica in un database Unicode

In un database Unicode, un valore stringa di carattere è compatibile con un valore di stringa grafico.

Se un operando è ... E l'altro operando è ... Il tipo di dati del risultato è ...
GRAFICA (x) CHAR (y) o GRAFICO (y) GRAFICA (z) dove z = max (x, y)
VARGRAFICO (x) CHAR (y) o VARCHAR (y) VARGRAPHIC (z) dove z = max (x, y)
VARCHAR (x) GRAFICO (y) o VARGRAPHIC VARGRAPHIC (z) dove z = max (x, y)
DBCLOB (x) CHAR (y) o VARCHAR (y) o CLOB (y) DBCLOB (z) dove z = max (x, y)
CLOB (x) GRAFICO (y) o VARGRAFICO (y) DBCLOB (z) dove z = max (x, y)
Le unità di stringa della stringa grafica dei risultati saranno CODEUNITS32 se entrambi gli operandi hanno unità di stringa CODEUNITS32o CODEUNITS16. I casi speciali si applicano quando le unità di stringa di un solo operando sono CODEUNITS32 e le unità di stringa dell'altro operando sono OCTETS o CODEUNITS16 con un attributo di lunghezza che supera il tipo di dati massimo in CODEUNITS32.
Se un operando è ... E l'altro operando è ... Il tipo di dati del risultato è ...
CHAR (x OCTETS) con x>63 GRAFICA (y CODEUNITS32) VARGRAPHIC (z CODEUNITS32) dove z = max (x, y)
GRAFICA (x CODEUNITS16) con x>63 CHAR (y CODEUNITS32) VARGRAPHIC (z CODEUNITS32) dove z = max (x, y)
VARCHAR (x OCTETS) con x>8168 GRAPHIC (y CODEUNITS32) o VARGRAPHIC (y CODEUNITS32) Errore
VARGRAPHIC (x CODEUNITS16 ) con x>8168 CHAR (y CODEUNITS32) o VARCHAR (y CODEUNITS32) Errore
CLOB (x OCTETS) con x>536870911 GRAPHIC (y CODEUNITS32), VARGRAPHIC (y CODEUNITS32), o DBCLOB (y CODEUNITS32) DBCLOB (536870911 CODEUNITS32)
DBCLOB (x CODEUNITS16 ) con x>536870911 CHAR (y CODEUNITS32), VARCHAR (y CODEUNITS32), o CLOB (y CODEUNITS32) DBCLOB (536 870 911 CODEUNITS32)

Stringhe binari

Le stringhe binarie sono compatibili con altre stringhe binarie e stringhe di carattere FOR BIT DATA. Le stringhe binarie includono BINARIO, VARBINARIO e BLOB.

Tabella 1. Operandi e il tipo di dati risultante
Se un operando è ... E l'altro operando è ... Il tipo di dati del risultato è ...
binary(x) BINARY (y) o CHAR (y) PER BIT DATA BINARIO (z) dove z=max (x, y)
VARBINARIO (x) BINARIO (y), VARBINARIO (y), CHAR (y) PER DATI DI BIT DATA o VARCHAR (y) PER DATI DI VARBINARIO (z) dove z=max (x, y)
VARCHAR (x) PER DATA BIT BINARIO (y) o VARBINARIO (y) VARBINARIO (z) dove z=max (x, y)
BLOB (x) BINARIO (y), VARBINARI (y), BLOB (y), CHAR (y) PER DATI DI TIPO o VARCHAR (y) PER BIT DATA BLOB (z) dove z=max (x, y)

numerico

Tipi numerici sono compatibili con altri tipi di dati numerici, tipi di dati stringa di carattere (eccetto CLOB), e in un database Unicode, tipi di dati a stringa grafica (tranne DBCLOB). I tipi numerici includono SMALLINT, INTEGER, BIGINT, DECIMALE, REAL, DOUBLE, e DECFLOAT.

Tabella 2. Operandi e il tipo di dati risultante
Se un operando è ... E l'altro operando è ... Il tipo di dati del risultato è ...
SMALLINT SMALLINT SMALLINT
SMALLINT Stringa DECFLOAT (34)
INTEGER SMALLINT o INTERO INTEGER
INTEGER Stringa DECFLOAT (34)
BIGINT SMALLINT, INTERO o BIGINT BIGINT
BIGINT Stringa DECFLOAT (34)
DECIMALE (w, x) SMALLINT DECIMALE (p, x) dove
p = x + max (w-x,5)1
DECIMALE (w, x) INTEGER DECIMALE (p, x) dove
p = x + max (w-x,11)1
DECIMALE (w, x) BIGINT DECIMALE (p, x) dove
p = x + max (w-x,19)1
DECIMALE (w, x) DECIMALE (y, z) DECIMALE (p, s) dove
p = max (x, z) + max (w - x, y - z)1
s = max (x, z)
DECIMALE (w, x) Stringa DECFLOAT (34)
REAL REAL REAL
REAL SMALLINT, INTERO, BIGINT o DECIMALE DOUBLE
REAL Stringa DECFLOAT (34)
DOUBLE SMALLINT, INTEGER, BIGINT, DECIMALE, REAL o DOUBLE DOUBLE
DOUBLE Stringa DECFLOAT (34)
DECFLOAT (n) SMALLINT, INTERO, DECIMALE (<=16,s), REAL o DOUBLE DECFLOAT (n)
DECFLOAT (n) BIGINT o DECIMALE (>16,s) DECFLOAT (34)
DECFLOAT (n) DECFLOAT (m) DECFLOAT (MAX (n, m))
DECFLOAT (n) Stringa DECFLOAT (34)
1 La precisione non può superare i 31.

Data e ora

I tipi di dati datetime sono compatibili con altri operandi dello stesso tipo di dati o di qualsiasi espressione di tipo CHAR o VARCHAR che contiene una rappresentazione di stringa valida dello stesso tipo di dati. Inoltre, DATE è compatibile con TIMESTAMP e l'altro operando di una TIMESTAMP può essere la rappresentazione di stringa di una data / ora o di una data. In un database Unicode sono compatibili caratteri e stringhe grafiche che implica che le rappresentazioni di stringa GRAPHIC o VARGRAPHIC di valori datetime siano compatibili con altri operandi datetime.

Tabella 3. Tipi di dati di risultato con operandi datetime
Se un operando è ... E l'altro operando è ... Il tipo di dati del risultato è ...
DATA DATE, CHAR (y) o VARCHAR (y) DATA
ORA TIME, CHAR (y) o VARCHAR (y) ORA
TIMESTAMP (x) TIMESTAMP (y) TIMESTAMP (max (x, y))
TIMESTAMP (x) DATE, CHAR (y) o VARCHAR (y) TIMESTAMP (x)

XML

Un valore XML è compatibile con un altro valore XML. Il tipo di dati del risultato è XML.

Booleano

Un valore booleano è compatibile con i seguenti valori o tipi:

  • Un altro valore booleano.
  • Tipi di dati interi binari, come SMALLINT, INTEGER e BIGINT.
  • Tipi di dati a stringa di carattere, tranne che per CLOB.
  • Tipi di dati a stringa grafica, ad eccezione di DBCLOB, in un database Unicode.

Il tipo di dati del risultato è BOOLEAN.

Un valore booleano è compatibile con un altro valore booleano. Il tipo di dati del risultato è BOOLEAN.

Tipi definiti dall'utente

Tipi distinti
Un valore di tipo distinto fortemente tipizzato è compatibile solo con un altro valore dello stesso tipo distinto. Il tipo di dati del risultato è il tipo distinto.

Se entrambi gli operandi hanno lo stesso tipo distinto debolmente digitato, il risultato è il tipo distinto. In caso contrario, se qualsiasi operando è un tipo distinto debolmente digitato allora il tipo di dati dell'operando è considerato il tipo di dati di origine e il tipo di dati di risultato è determinato in base alla combinazione di operandi di tipo dati integrati.

Tipi di dati array
Un valore di tipo dati array definito dall'utente è compatibile solo con un altro valore dello stesso tipo di dati array definito dall'utente. Il tipo di dati del risultato è il tipo di dati array definito dall'utente.
Tipi di dati cursore
Un valore CURSOR è compatibile con un altro valore CURSOR. Il tipo di dati di risultato è CURSOR. Un valore di tipo dati cursore definito dall'utente è compatibile solo con un altro valore dello stesso tipo di dati del cursore definito dall'utente. Il tipo di dati del risultato è il tipo di dati del cursore definito dall'utente.
Tipi di dati di riga
Un valore di tipo dati riga definito dall'utente è compatibile solo con un altro valore dello stesso tipo di dati della riga definita dall'utente. Il tipo di dati del risultato è il tipo di dati di riga definito dall'utente.

Tipi di riferimento

Un valore di tipo di riferimento è compatibile con un altro valore dello stesso tipo di riferimento purché i loro tipi di destinazione abbiano un supertipo comune. Il tipo di dati del risultato è un tipo di riferimento avente il supertipo comune come tipo di destinazione. Se tutti gli operandi hanno la tabella di portata identica, il risultato ha quella portata. Altrimenti il risultato è inscopato.

Tipi strutturati

Un valore di tipo strutturato è compatibile con un altro valore dello stesso tipo strutturato purché abbiano un supertipo comune. Il tipo di dati statico della colonna di tipo strutturato risultante è il tipo strutturato che è il supertipo meno comune di entrambe le colonne.

Ad esempio, considerare la seguente gerarchia di tipo strutturato,
      A
     / \
    B   C
   / \
  D   E
 / \
F   G
I tipi strutturati di tipo statico E e F sono compatibili con il tipo statico risultante di B, che è il super tipo meno comune di E e F.

Attributo annullabile del risultato

Ad eccezione di INTERSECT e TRANNE, il risultato consente di effettuare i nulli a meno che entrambi gli operandi non consentano nulli.
  • Per INTERSECT, se entrambi gli operandi non consentono nulli il risultato non consente nulli (l'incrostato non sarebbe mai nullo).
  • Per TRANNE, se il primo operando non consente nulli il risultato non consente nulli (il risultato può essere solo valori dal primo operando).