sql >> Database >  >> RDS >> Oracle

CAST()-functie in Oracle

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.


  1. Fouten in evoluties op Heroku

  2. Hoe een enorme tabelgegevens naar een andere tabel in SQL Server te kopiëren?

  3. cx orakel ImportError

  4. PostgreSQL:automatisch verhogen op basis van unieke beperking met meerdere kolommen