sql >> Databasteknik >  >> RDS >> Oracle

CAST() Funktion i Oracle

I Oracle Database, CAST() funktion konverterar sitt argument till en annan datatyp.

Mer specifikt låter den dig konvertera inbyggda datatyper eller samlingstypade värden av en typ till en annan inbyggd datatyp eller insamlingstyp.

Syntax

Syntaxen ser ut så här:

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

Exempel

Här är ett exempel att visa:

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

Resultat:

10-AUG-30 12.00.00.000000000 AM

Ange ett standardvärde vid konverteringsfel

Du kan använda DEFAULT return_value ON CONVERSION ERROR argument för att ange vad som ska returneras om ett fel uppstår vid konvertering av värdet.

Exempel:

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

Resultat:

0

Här är vad som händer när vi tar bort DEFAULT return_value ON CONVERSION ERROR argument:

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

Resultat:

ORA-01722: invalid number

Ange ett format – fmt Argument

I det här exemplet använder jag fmt argument för att ange formatet för datumet i det första argumentet:

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 utelämnar formatet

Att utelämna formatet kan resultera i ett fel, beroende på om det första argumentet överensstämmer med sessionens standardformatering för den resulterande datatypen.

Så här händer när jag utelämnar 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 det här fallet försökte jag konvertera en sträng till en TIMESTAMP värde, men strängen liknade inte en TIMESTAMP värde baserat på min sessions NLS_TIMESTAMP_FORMAT parameter och ett fel uppstod.

Här är formatet som min nuvarande session använder för TIMESTAMP värden:

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

Resultat:

DD-MON-RR HH.MI.SSXFF AM

Låt oss ändra det:

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

Resultat:

Session altered.

Och låt oss nu köra den föregående konverteringen igen:

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

Resultat:

Friday, 3 September 2021 12.0.0.000000000 AM

Den här gången är det inget fel.

Observera att även om jag uttryckligen ändrade NLS_TIMESTAMP_FORMAT parameter här är det vanligtvis bättre att ändra NLS_TERRITORY parameter istället. Ändra NLS_TERRITORY parametern ändrar implicit andra NLS-parametrar, såsom datumformat, valutasymboler, etc.

I alla fall, som visats ovan, istället för att ändra någon av NLS-parametrarna, kan du använda fmt argument när funktionen anropas.

nlsparam Argument

Du kan använda den valfria nlsparam argument för att specificera NLS-parametrar inifrån funktionen.

Exempel:

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 det här fallet började jag med att ställa in några av min sessions NLS-parametrar. Sedan när jag anropade CAST() , jag skickade strängen på spanska och använde sedan nlsparam argument för att specificera detta.

Så resultatet visas med min sessions NLS-parametrar, men det faktiska värdet som jag klarade var på spanska.

Mer information

Det finns mycket att tänka på när du konverterar mellan datatyper. Se Oracles dokumentation för mer information om hur du använder CAST() funktion.


  1. T-SQL vs SQL

  2. Här är tre skäl till varför du kan se toppaktivitet i din SQL-instans

  3. Brister med mysql_real_escape_string?

  4. Integrerad transportdatamodell