sql >> Database teknologi >  >> RDS >> Oracle

CAST() Funktion i Oracle

I Oracle Database er CAST() funktion konverterer sit argument til en anden datatype.

Mere specifikt giver det dig mulighed for at konvertere indbyggede datatyper eller samlingstypede værdier af én type til en anden indbygget datatype eller indsamlingstype.

Syntaks

Syntaksen ser sådan ud:

CAST({ expr | MULTISET (subquery) } AS type_name
  [ DEFAULT return_value ON CONVERSION ERROR ]
  [, fmt [, 'nlsparam' ] ])

Eksempel

Her er et eksempel til demonstration:

SELECT CAST('10-AUG-30' AS TIMESTAMP)
FROM DUAL;

Resultat:

10-AUG-30 12.00.00.000000000 AM

Angiv en standardværdi ved konverteringsfejl

Du kan bruge DEFAULT return_value ON CONVERSION ERROR argument for at angive, hvad der skal returneres, hvis der opstår en fejl ved konvertering af værdien.

Eksempel:

SELECT CAST(
    'Homer' AS NUMBER
    DEFAULT '0' ON CONVERSION ERROR
    )
FROM DUAL;

Resultat:

0

Her er, hvad der sker, når vi fjerner DEFAULT return_value ON CONVERSION ERROR argument:

SELECT CAST(
    'Homer' AS NUMBER
    )
FROM DUAL;

Resultat:

ORA-01722: invalid number

Angiv et format – fmt Argument

I dette eksempel bruger jeg fmt argument for at angive formatet på datoen i det første argument:

SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP,
    'Day, DD Month YYYY'
    )
FROM DUAL;

Resultat:

03-SEP-21 12.00.00.000000000 AM

Når du udelader formatet

Udeladelse af formatet kan resultere i en fejl, afhængigt af om det første argument stemmer overens med sessionens standardformatering for den resulterende datatype.

Her er, hvad der sker, når jeg udelader formatargumentet:

SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP
    )
FROM DUAL;

Resultat:

Error report -
ORA-01858: a non-numeric character was found where a numeric was expected

I dette tilfælde forsøgte jeg at konvertere en streng til en TIMESTAMP værdi, men strengen lignede ikke en TIMESTAMP værdi baseret på min sessions NLS_TIMESTAMP_FORMAT parameter, og der opstod en fejl.

Her er formatet, som min nuværende session bruger til TIMESTAMP værdier:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';

Resultat:

DD-MON-RR HH.MI.SSXFF AM

Lad os ændre det:

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'fmDay, DD Month YYYY HH.MI.SSXFF AM';

Resultat:

Session altered.

Og lad os nu køre den forrige konvertering igen:

SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP
    )
FROM DUAL;

Resultat:

Friday, 3 September 2021 12.0.0.000000000 AM

Denne gang er der ingen fejl.

Bemærk, at selvom jeg eksplicit har ændret NLS_TIMESTAMP_FORMAT parameter her, er det normalt bedre at ændre NLS_TERRITORY parameter i stedet for. Ændring af NLS_TERRITORY parameter ændrer implicit andre NLS-parametre, såsom datoformater, valutasymboler osv.

Under alle omstændigheder, som vist ovenfor, i stedet for at ændre nogen af ​​NLS-parametrene, kan du bruge fmt argument, når funktionen kaldes.

nlsparam Argument

Du kan bruge den valgfrie nlsparam argument for at angive NLS-parametre fra funktionen.

Eksempel:

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;

Resultat:

Saturday, 10 August 2030

I dette tilfælde startede jeg med at indstille nogle af min sessions NLS-parametre. Så da jeg kaldte CAST() , jeg bestod strengen på spansk og brugte derefter nlsparam argument for at specificere dette.

Så resultatet vises ved hjælp af min sessions NLS-parametre, men den faktiske værdi, som jeg bestod, var på spansk.

Flere oplysninger

Der er meget at være opmærksom på, når du konverterer mellem datatyper. Se Oracles dokumentation for mere information om brug af CAST() funktion.


  1. Sådan opbevarer du bedst brugeroplysninger og brugerlogin og adgangskode

  2. The Performance Tuning Maze

  3. SQL joining spørgsmål

  4. Oracle Database 20c Nye funktioner