Dans Oracle Database, le CAST()
La fonction convertit son argument en un type de données différent.
Plus précisément, il vous permet de convertir des types de données intégrés ou des valeurs de type collection d'un type en un autre type de données intégré ou type de collection.
Syntaxe
La syntaxe ressemble à ceci :
CAST({ expr | MULTISET (subquery) } AS type_name
[ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
Exemple
Voici un exemple pour illustrer :
SELECT CAST('10-AUG-30' AS TIMESTAMP)
FROM DUAL;
Résultat :
10-AUG-30 12.00.00.000000000 AM
Fournir une valeur par défaut en cas d'erreur de conversion
Vous pouvez utiliser le DEFAULT return_value ON CONVERSION ERROR
argument pour spécifier ce qu'il faut renvoyer en cas d'erreur lors de la conversion de la valeur.
Exemple :
SELECT CAST(
'Homer' AS NUMBER
DEFAULT '0' ON CONVERSION ERROR
)
FROM DUAL;
Résultat :
0
Voici ce qui se passe lorsque nous supprimons le DEFAULT return_value ON CONVERSION ERROR
argument :
SELECT CAST(
'Homer' AS NUMBER
)
FROM DUAL;
Résultat :
ORA-01722: invalid number
Spécifiez un format – Le fmt
Argumentation
Dans cet exemple, j'utilise le fmt
argument pour spécifier le format de la date dans le premier argument :
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP,
'Day, DD Month YYYY'
)
FROM DUAL;
Résultat :
03-SEP-21 12.00.00.000000000 AM
Lorsque vous omettez le format
L'omission du format peut entraîner une erreur, selon que le premier argument est conforme au formatage par défaut de la session pour le type de données résultant.
Voici ce qui se passe lorsque j'omets l'argument format :
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL;
Résultat :
Error report - ORA-01858: a non-numeric character was found where a numeric was expected
Dans ce cas, j'ai essayé de convertir une chaîne en un TIMESTAMP
valeur, mais la chaîne ne ressemblait pas à un TIMESTAMP
valeur basée sur le NLS_TIMESTAMP_FORMAT
de ma session paramètre et une erreur s'est produite.
Voici le format que ma session actuelle utilise pour TIMESTAMP
valeurs :
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Résultat :
DD-MON-RR HH.MI.SSXFF AM
Changeons cela :
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'fmDay, DD Month YYYY HH.MI.SSXFF AM';
Résultat :
Session altered.
Et maintenant, réexécutons la conversion précédente :
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL;
Résultat :
Friday, 3 September 2021 12.0.0.000000000 AM
Cette fois, il n'y a pas d'erreur.
Notez que, bien que j'aie explicitement changé le NLS_TIMESTAMP_FORMAT
paramètre ici, il est généralement préférable de modifier le NLS_TERRITORY
paramètre à la place. Modification du NLS_TERRITORY
paramètre modifie implicitement d'autres paramètres NLS, tels que les formats de date, les symboles monétaires, etc.
Dans tous les cas, comme démontré ci-dessus, au lieu de modifier l'un des paramètres NLS, vous pouvez utiliser le fmt
argument lors de l'appel de la fonction.
Le nlsparam
Argumentation
Vous pouvez utiliser le nlsparam
facultatif argument pour spécifier les paramètres NLS à partir de la fonction.
Exemple :
ALTER SESSION SET NLS_TERRITORY = 'Australia';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'English';
ALTER SESSION SET NLS_DATE_FORMAT = 'fmDay, DD Month YYYY';
SELECT
CAST(
'sábado, 10 agosto 30' AS DATE,
'Day, DD Month RR',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Résultat :
Saturday, 10 August 2030
Dans ce cas, j'ai commencé par définir certains des paramètres NLS de ma session. Puis quand j'ai appelé CAST()
, j'ai passé la chaîne en espagnol, puis j'ai utilisé le nlsparam
argument pour le spécifier.
Ainsi, le résultat est affiché en utilisant les paramètres NLS de ma session, mais la valeur réelle que j'ai transmise était en espagnol.
Plus d'informations
Il y a beaucoup à garder à l'esprit lors de la conversion entre les types de données. Voir la documentation d'Oracle pour plus d'informations sur l'utilisation de CAST()
fonction.