Questa appendice spiega le differenze semantiche tra i tipi di baseCHAR
eVARCHAR2
. Queste sottili ma importanti differenze entrano in gioco quando si assegnano, confrontano, inseriscono, aggiornano, selezionano o recuperano i valori dei caratteri.
Questa appendice discute i seguenti argomenti:
Assegnazione di Valori di Carattere Confrontando i Valori di Carattere Inserimento di Valori di Carattere Selezione di Valori di Carattere
Assegnazione di Valori di Carattere
Quando si assegna un valore di carattere è un CHAR
variabile, se il valore è minore di quella dichiarata la lunghezza della variabile, PL/SQL vuoto-pastiglie il valore dichiarato lunghezza. Quindi, le informazioni sugli spazi vuoti finali sono perse. Nell’esempio seguente, il valore assegnato a last_name
include sei spazi vuoti finali, non solo uno:
last_name CHAR(10) := 'CHEN '; -- note trailing blank
Se il valore del carattere è più lungo della lunghezza dichiarata della variabileCHAR
, PL/SQL interrompe l’assegnazione e solleva l’eccezione predefinitaVALUE_ERROR
. PL / SQL non tronca il valore né tenta di tagliare gli spazi vuoti finali. Ad esempio, data la dichiarazione
acronym CHAR(4);
la seguente assegnazione genera VALUE_ERROR
:
acronym := 'SPCA '; -- note trailing blank
Quando si assegna un valore di carattere a una variabileVARCHAR2
, se il valore è più breve della lunghezza dichiarata della variabile, PL / SQL non cancella il valore né rimuove gli spazi vuoti finali. I valori dei caratteri vengono assegnati intatti, quindi nessuna informazione viene persa. Se il valore del carattere è più lungo della lunghezza dichiarata della variabile VARCHAR2
, PL/SQL interrompe l’assegnazione e genera VALUE_ERROR
. PL / SQL non tronca il valore né tenta di tagliare gli spazi vuoti finali.
Confronto dei valori dei caratteri
È possibile utilizzare gli operatori relazionali per confrontare i valori dei caratteri per l’uguaglianza o la disuguaglianza. I confronti si basano sulla sequenza di raccolta utilizzata per il set di caratteri del database. Un valore di carattere è maggiore di un altro se lo segue nella sequenza di raccolta. Ad esempio, date le dichiarazioni
last_name1 VARCHAR2(10) := 'COLES';last_name2 VARCHAR2(10) := 'COLEMAN';
la seguente condizione IF è true:
IF last_name1 > last_name2 THEN ...
ANSI/ISO SQL richiede che due valori di caratteri confrontati abbiano lunghezze uguali. Quindi, se entrambi i valori in un confronto hanno datatype CHAR
, viene utilizzata la semantica blank-padding. Cioè, prima di confrontare i valori dei caratteri di lunghezza disuguale, PL / SQL blank-pads il valore più breve alla lunghezza del valore più lungo. Ad esempio, date le dichiarazioni
last_name1 CHAR(5) := 'BELLO';last_name2 CHAR(10) := 'BELLO '; -- note trailing blanks
la seguente condizione IF
è true:
IF last_name1 = last_name2 THEN ...
Se uno dei valori in un confronto ha datatype VARCHAR2
, la semantica di riempimento non vuoto è usata. Cioè, quando si confrontano i valori dei caratteri di lunghezza disuguale, PL / SQL non apporta regolazioni e utilizza le lunghezze esatte. Per esempio, date le dichiarazioni
last_name1 VARCHAR2(10) := 'DOW';last_name2 VARCHAR2(10) := 'DOW '; -- note trailing blanks
il seguente IF
la condizione è falsa:
IF last_name1 = last_name2 THEN ...
Se un valore in un confronto di tipo VARCHAR2
e l’altro valore è datatype CHAR
, camere non-vuoto-imbottitura semantica sono utilizzati. Ma, ricorda, quando assegni un valore di carattere a una variabileCHAR
, se il valore è più breve della lunghezza dichiarata della variabile, PL/SQL blank-pads il valore alla lunghezza dichiarata. Così, date le dichiarazioni
last_name1 VARCHAR2(10) := 'STAUB';last_name2 CHAR(10) := 'STAUB'; -- PL/SQL blank-pads value
il seguente IF
la condizione è falsa, perché il valore di last_name2
include cinque spazi vuoti finali:
IF last_name1 = last_name2 THEN ...
Tutti i valori letterali di stringa sono datatype CHAR
. Quindi, se entrambi i valori in un confronto sono letterali, viene utilizzata la semantica di riempimento vuoto. Se un valore è un valore letterale, la semantica blank-padding viene utilizzata solo se l’altro valore ha datatype CHAR
.
Inserimento di valori di caratteri
Quando si inserisce il valore di una variabile di caratteri PL / SQL in una colonna del database Oracle, se il valore è vuoto o meno dipende dal tipo di colonna, non dal tipo di variabile.
Quando si inserisce un valore di carattere in una colonna di databaseCHAR
, Oracle non rimuove gli spazi vuoti finali. Se il valore è più breve della larghezza definita della colonna, Oracle blank-pads il valore alla larghezza definita. Di conseguenza, le informazioni sugli spazi vuoti finali vengono perse. Se il valore del carattere è più lungo della larghezza definita della colonna, Oracle interrompe l’insert e genera un errore.
Quando si inserisce un valore di carattere in una colonna di databaseVARCHAR2
, Oracle non rimuove gli spazi vuoti finali. Se il valore è più breve della larghezza definita della colonna, Oracle non cancella il valore. I valori dei caratteri vengono memorizzati intatti, quindi nessuna informazione viene persa. Se il valore del carattere è più lungo della larghezza definita della colonna, Oracle interrompe l’insert e genera un errore.
Nota: le stesse regole si applicano durante l’aggiornamento.
Quando si inseriscono valori di carattere, per assicurarsi che non vengano memorizzati spazi vuoti finali, utilizzare la funzioneRTRIM
, che taglia gli spazi vuoti finali. Un esempio segue:
DECLARE ... my_name VARCHAR2(15);BEGIN ... my_ename := 'LEE '; -- note trailing blanks INSERT INTO emp VALUES (my_empno, RTRIM(my_ename), ...); -- inserts 'LEE'END;
Selezione dei valori dei caratteri
Quando si seleziona un valore da una colonna di database Oracle in una variabile di caratteri PL / SQL, se il valore è vuoto o meno dipende dal tipo di variabile, non dal tipo di colonna.
Quando si seleziona un valore di colonna in una variabile CHAR
, se il valore è più breve della lunghezza dichiarata della variabile, PL / SQL blank-pads il valore alla lunghezza dichiarata. Di conseguenza, le informazioni sugli spazi vuoti finali vengono perse. Se il valore del carattere è più lungo della lunghezza dichiarata della variabile, PL / SQL interrompe l’assegnazione e genera VALUE_ERROR
.
Quando si seleziona un valore di colonna in un VARCHAR2
variabile, se il valore è più breve della lunghezza dichiarata della variabile, PL / SQL né blank-pads il valore né strisce spazi vuoti finali. I valori dei caratteri vengono memorizzati intatti, quindi nessuna informazione viene persa.
Ad esempio, quando si seleziona un valore di colonnaCHAR
riempito in una variabileVARCHAR2
, gli spazi vuoti finali non vengono rimossi. Se il valore del carattere è più lungo della lunghezza dichiarata della variabile VARCHAR2
, PL/SQL interrompe l’assegnazione e genera VALUE_ERROR
.
Nota: le stesse regole si applicano durante il recupero.