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.