明示的な型の変換を行なう、型のキャストを行なう
※ CAST 関数を使用しない場合でも 暗黙的な変換 が行なわれることが多い。暗黙変換が行なわれずにエラーになる関数もある。
- CAST ( expr AS type_name )
- CAST ( expr AS type_name ↵
[ DEFAULT def_val ON CONVERSION ERROR ] ↵
[ , format[, nls_param]] )
return [ any datatype ]
- CAST ( MULTISET ( query ) AS type_name )
return [ collection ]
- 型をキャストしたデータ、または、TYPE にキャストした副問合せの内容
Oracle 12c R2 以降の場合、format 書式にて変換出来ない値を def_val で戻すことが可能。
- SQL および PL/SQL の両方で使用可能。但し、PL/SQL では機能が制限される。
組み込み型の名称
DEFAULT ... ON CONVERSION ERROR で使用可能なデータ型は以下に制限される。
- 数値型 BINARY_DOUBLE / BINARY_FLOAT / NUMBER
- 日付型 DATE / TIMESTAMP / TIME WITH TIME ZONE / TIMESTAMP WITH LOCAL TIME ZONE
- 期間型 INTERVAL DAY TO SECOND / INTERVAL YEAR TO MONTH (※1)
(※1) 期間型には フォーマット文字列、各国語サポートパラメータ は使用できない。
変換エラー時のデフォルト値
フォーマットエラーとならないバインド変数または文字リテラル
カラム名は使用できない(Oracle 12c R2 時点)
フォーマット文字列
各国語サポートパラメータ例
nls_param の種類 | expr のタイプ | 設定例 |
NLS_DATE_LANGUAGE | 日時文字列式 | JAPANESE |
NLS_CALENDAR | 'JAPANESE IMPERIAL'(要クォート) |
NLS_NUMERIC_CHARACTERS | 数値、数値文字列式 | NLS 関連パラメータ 参照 |
NLS_CURRENCY |
NLS_ISO_CURRENCY |
NLS_DUAL_CURRENCY |
CAST 関数の内容(組み込みデータ型の型変換)
任意の組み込み型による 式 expr を 組み込みデータ型 type_name 型に変換して戻す。
TO_xxx 関数シリーズ とは異なり書式を指定することはできない。(Oracle 12c R1 以前)
CHAR ⇔ VARCHAR2、CHAR ⇔ CLOB、NUMBER ⇔ VARCHAR2 など、知らずに 暗黙変換 による型キャストを利用していることが多い。
良くある失敗:カラムが暗黙変換されると、そのカラムはインデックスを使用できない。
注意
PL/SQL では SQL 関数としての CAST と異なった仕様となる。
SQL> declare
2 str varchar2(10);
3 begin
4 str := CAST(10 AS VARCHAR2);
5 end;
6 /
PL/SQLプロシージャが正常に完了しました。
SQL> declare
2 str varchar2(10);
3 begin
4 str := CAST(10 AS VARCHAR2(10));
5 end;
6 /
str := CAST(10 AS VARCHAR2(10));
*
行4でエラーが発生しました。:
ORA-06550: 行4、列28:
CAST 使用例
CHAR 型の変換
SQL> select translate(CAST('ひらがな' as CHAR(20 byte)), ' ', '_')
2 from dual;
TRANSLATE(CAST('ひらがな'ASCHAR(20BYTE)),'','_')
--------------------------------------------------------------------
ひらがな____________
SQL>
SQL> select translate(CAST('ひらがな' as CHAR(20 char)), ' ', '_')
2 from dual;
TRANSLATE(CAST('ひらがな'ASCHAR(20CHAR))
----------------------------------------
ひらがな________________
SQL>
VARCHAR2 型で 文字リテラル が キャスト先の定義より長い場合
SQL> select CAST('1234567890' AS VARCHAR(5)) from dual;
CAST('1234
----------
12345
NUMBER 型の場合(丸め処理される)
SQL> select CAST(1.534567890 AS NUMBER(5)) from dual;
CAST(1.534567890ASNUMBER(5))
----------------------------
2
数値のオーバーフロー (Oracle 12c R1 以前)
SQL> select CAST(1234567890 AS NUMBER(5)) from dual;
select CAST(1234567890 AS NUMBER(5)) from dual
*
行1でエラーが発生しました。:
ORA-01438: この列に許容される指定精度より大きな値です
数値のオーバーフロー対応 (Oracle 12c R2 以降)
SQL> select
2 CAST(1234567890 AS NUMBER(5) DEFAULT null ON CONVERSION ERROR) NG_EXPR,
3 CAST(1234567890 AS NUMBER(5) DEFAULT null ON CONVERSION ERROR, '99999') OK_EXPR1,
4 CAST(1234567890 AS NUMBER DEFAULT null ON CONVERSION ERROR, '99999') OK_EXPR2
5 from dual;
NG_EXPR OK_EXPR1 OK_EXPR2
---------- ---------- ----------
1234567890 <NULL> <NULL>
データ型の表記に精度は使わないほうが良い模様…
文字リテラルからタイムゾーン付きタイムスタンプへ
SQL> select CAST('2000 01 01 00 00 00 +9:00' as timestamp with time zone)
2 from dual;
CAST('20000101000000+9:00'ASTIMESTAMPWITHTIMEZONE)
--------------------------------------------------------------------------
00-01-01 00:00:00.000000 +09:00
SQL 関数 - CAST 関連