In Oracle Database, de CAST()
functie converteert zijn argument naar een ander gegevenstype.
Meer in het bijzonder kunt u hiermee ingebouwde gegevenstypen of verzamelingsgetypte waarden van het ene type converteren naar een ander ingebouwd gegevenstype of verzamelingstype.
Syntaxis
De syntaxis gaat als volgt:
CAST({ expr | MULTISET (subquery) } AS type_name
[ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
Voorbeeld
Hier is een voorbeeld om te demonstreren:
SELECT CAST('10-AUG-30' AS TIMESTAMP)
FROM DUAL;
Resultaat:
10-AUG-30 12.00.00.000000000 AM
Geef een standaardwaarde op bij conversiefout
U kunt de DEFAULT return_value ON CONVERSION ERROR
argument om aan te geven wat er moet worden geretourneerd in het geval dat er een fout optreedt bij het converteren van de waarde.
Voorbeeld:
SELECT CAST(
'Homer' AS NUMBER
DEFAULT '0' ON CONVERSION ERROR
)
FROM DUAL;
Resultaat:
0
Dit is wat er gebeurt als we de DEFAULT return_value ON CONVERSION ERROR
argument:
SELECT CAST(
'Homer' AS NUMBER
)
FROM DUAL;
Resultaat:
ORA-01722: invalid number
Geef een formaat op – De fmt
Argument
In dit voorbeeld gebruik ik de fmt
argument om het formaat van de datum in het eerste argument te specificeren:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP,
'Day, DD Month YYYY'
)
FROM DUAL;
Resultaat:
03-SEP-21 12.00.00.000000000 AM
Als je het formaat weglaat
Het weglaten van de indeling kan resulteren in een fout, afhankelijk van of het eerste argument overeenkomt met de standaardopmaak van de sessie voor het resulterende gegevenstype.
Dit is wat er gebeurt als ik het formaatargument weglaat:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL;
Resultaat:
Error report - ORA-01858: a non-numeric character was found where a numeric was expected
In dit geval heb ik geprobeerd een string te converteren naar een TIMESTAMP
waarde, maar de tekenreeks leek niet op een TIMESTAMP
waarde gebaseerd op de NLS_TIMESTAMP_FORMAT
. van mijn sessie parameter en er is een fout opgetreden.
Dit is het formaat dat mijn huidige sessie gebruikt voor TIMESTAMP
waarden:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Resultaat:
DD-MON-RR HH.MI.SSXFF AM
Laten we dat veranderen:
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'fmDay, DD Month YYYY HH.MI.SSXFF AM';
Resultaat:
Session altered.
En laten we nu de vorige conversie opnieuw uitvoeren:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL;
Resultaat:
Friday, 3 September 2021 12.0.0.000000000 AM
Deze keer is er geen fout.
Merk op dat, hoewel ik de NLS_TIMESTAMP_FORMAT
. expliciet heb gewijzigd, parameter hier, is het meestal beter om de NLS_TERRITORY
. te wijzigen parameter in plaats daarvan. Wijzigen van de NLS_TERRITORY
parameter verandert impliciet andere NLS-parameters, zoals de datumnotaties, valutasymbolen, enz.
In ieder geval, zoals hierboven aangetoond, kunt u in plaats van een van de NLS-parameters te wijzigen, de fmt
gebruiken argument bij het aanroepen van de functie.
De nlsparam
Argument
U kunt de optionele nlsparam
. gebruiken argument om NLS-parameters op te geven vanuit de functie.
Voorbeeld:
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;
Resultaat:
Saturday, 10 August 2030
In dit geval begon ik met het instellen van enkele NLS-parameters van mijn sessie. Toen ik CAST()
. belde , ik heb de string in het Spaans doorgegeven en vervolgens de nlsparam
. gebruikt argument om dit te specificeren.
Het resultaat wordt dus weergegeven met behulp van de NLS-parameters van mijn sessie, maar de werkelijke waarde die ik heb doorgegeven was in het Spaans.
Meer informatie
Er is veel om rekening mee te houden bij het converteren tussen gegevenstypen. Raadpleeg de documentatie van Oracle voor meer informatie over het gebruik van de CAST()
functie.