Oracle
 sql >> Datenbank >  >> RDS >> Oracle

CAST()-Funktion in Oracle

In der Oracle-Datenbank der CAST() Funktion konvertiert ihr Argument in einen anderen Datentyp.

Genauer gesagt können Sie integrierte Datentypen oder sammlungstypisierte Werte eines Typs in einen anderen integrierten Datentyp oder Sammlungstyp konvertieren.

Syntax

Die Syntax lautet wie folgt:

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

Beispiel

Hier ist ein Beispiel zur Veranschaulichung:

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

Ergebnis:

10-AUG-30 12.00.00.000000000 AM

Bei Konvertierungsfehler einen Standardwert angeben

Sie können den DEFAULT return_value ON CONVERSION ERROR Argument, um anzugeben, was zurückgegeben werden soll, falls beim Konvertieren des Werts ein Fehler auftritt.

Beispiel:

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

Ergebnis:

0

Folgendes passiert, wenn wir den DEFAULT return_value ON CONVERSION ERROR Argument:

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

Ergebnis:

ORA-01722: invalid number

Format angeben – Der fmt Argument

In diesem Beispiel verwende ich den fmt Argument, um das Format des Datums im ersten Argument anzugeben:

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

Ergebnis:

03-SEP-21 12.00.00.000000000 AM

Wenn Sie das Format weglassen

Das Weglassen des Formats kann zu einem Fehler führen, je nachdem, ob das erste Argument der Standardformatierung der Sitzung für den resultierenden Datentyp entspricht.

Folgendes passiert, wenn ich das Formatargument weglasse:

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

Ergebnis:

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

In diesem Fall habe ich versucht, einen String in einen TIMESTAMP umzuwandeln Wert, aber die Zeichenfolge ähnelte keinem TIMESTAMP Wert basierend auf dem NLS_TIMESTAMP_FORMAT meiner Sitzung Parameter, und ein Fehler ist aufgetreten.

Hier ist das Format, das meine aktuelle Sitzung für TIMESTAMP verwendet Werte:

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

Ergebnis:

DD-MON-RR HH.MI.SSXFF AM

Lassen Sie uns das ändern:

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

Ergebnis:

Session altered.

Und jetzt lassen Sie uns die vorherige Konvertierung erneut ausführen:

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

Ergebnis:

Friday, 3 September 2021 12.0.0.000000000 AM

Diesmal gibt es keinen Fehler.

Beachten Sie, dass ich das NLS_TIMESTAMP_FORMAT explizit geändert habe Parameter hier, ist es normalerweise besser, den NLS_TERRITORY zu ändern stattdessen Parameter. Ändern des NLS_TERRITORY -Parameter ändert implizit andere NLS-Parameter, wie Datumsformate, Währungssymbole usw.

In jedem Fall können Sie, wie oben gezeigt, anstatt einen der NLS-Parameter zu ändern, fmt verwenden Argument beim Aufruf der Funktion.

Der nlsparam Argument

Sie können das optionale nlsparam verwenden -Argument, um NLS-Parameter innerhalb der Funktion anzugeben.

Beispiel:

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;

Ergebnis:

Saturday, 10 August 2030

In diesem Fall habe ich damit begonnen, einige der NLS-Parameter meiner Sitzung festzulegen. Dann, als ich CAST() aufrief , habe ich die Zeichenfolge auf Spanisch übergeben und dann den nlsparam verwendet Argument, um dies anzugeben.

Das Ergebnis wird also mit den NLS-Parametern meiner Sitzung angezeigt, aber der tatsächliche Wert, den ich übergeben habe, war auf Spanisch.

Weitere Informationen

Bei der Konvertierung zwischen Datentypen ist einiges zu beachten. Weitere Informationen zur Verwendung von CAST() finden Sie in der Oracle-Dokumentation Funktion.