Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction CAST() dans Oracle

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.