CAST
構文
domain_validate_clause::=
目的
CAST
を使用すると、ある組込みデータ型またはコレクション型の値を、別の組込みデータ型またはコレクション型に変換できます。名前のないオペランド(日付や副問合せの結果セットなど)または名前付きのコレクション(VARRAYやネストした表など)を型互換のデータ型または名前付きコレクションにキャストできます。type_name
は、組込みデータ型またはコレクション型の名前、またはドメイン名である必要があり、オペランドは、組込みデータ型であるか、またはその値がコレクション値に評価される必要があります。
オペランドでは、expr
は組込みデータ型、コレクション型またはANYDATA
型のインスタンスのいずれかです。expr
がANYDATA
型のインスタンスである場合、CAST
はANYDATA
インスタンスの値を抽出し、その値がキャスト対象の型と一致する場合はその値を戻し、一致しない場合はNULLを戻します。MULTISET
は、副問合せの結果セットを取り、コレクション値を戻すようにOracle Databaseに通知します。表7-1に、どの組込みデータ型が、どの組込みデータ型にキャストできるかを示します。(CAST
は、LONG
型、LONG
RAW
型、またはOracleが提供する型をサポートしていません。)
CAST
は、LOBデータ型のいずれも直接的にサポートしていません。CAST
を使用して、CLOB
値を文字データ型に変換するか、BLOB
値をRAW
データ型に変換すると、データベースは暗黙的にLOB値を文字またはRAWデータに変換し、結果値を明示的にターゲットのデータ型にキャストします。結果値がターゲットの型より大きい場合、エラーが戻されます。
CAST
... MULTISET
を使用してコレクション値を取得すると、CAST
ファンクションに渡される問合せ内のSELECT構文のリストのアイテムは、ターゲットのコレクション要素型に対応する属性型に変換されます。
'X'が付いたセルは、CAST
を使用してソース・データ型から宛先データ型に変換できることを示します。
表7-1 組込みデータ型のキャスト
宛先データ型 | BINARY_FLOAT、BINARY_DOUBLEから | CHAR、VARCHAR2から | NUMBER/INTEGERから | DATETIME/INTERVALから(ノート1) | RAWから | ROWID、UROWIDから(ノート2) | NCHAR、NVARCHAR2から | BOOLEANから |
---|---|---|---|---|---|---|---|---|
BINARY_FLOAT、BINARY_DOUBLEへ |
|
|
|
|
|
|
|
|
CHAR、VARCHAR2へ |
|
|
|
|
|
|
|
|
NUMBER/INTEGERへ |
|
|
|
|
|
|
|
|
DATETIME/INTERVALへ |
|
|
|
|
|
|
|
|
RAWへ |
|
|
|
|
|
|
|
|
ROWID、UROWIDへ |
|
|
|
|
|
|
|
|
NCHAR、NVARCHAR2へ |
|
|
|
|
|
|
|
|
BOOLEANへ |
|
|
|
|
|
|
|
|
ノート1: DATETIME/INTERVALには、DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIMEZONE
、TIMESTAMP
WITH
LOCAL
TIME
ZONE
、INTERVAL
DAY
TO
SECOND
およびINTERVAL
YEAR
TO
MONTH
が含まれます。
ノート2: UROWID
が索引構成表のROWID
の値を含んでいる場合、UROWID
をROWID
にキャストすることはできません。
ノート3: このタイプの変換には、DEFAULT
return_value
ON
CONVERSION
ERROR
句を指定できます。このタイプの変換には、fmt
およびnlsparam
句を指定できます。例外として、INTERVAL
DAY
TO
SECOND
に変換する際にはfmtを指定することはできず、INTERVAL
YEAR
TO
MONTH
に変換する際にはfmt
またはnlsparam
を指定することはできません。
ノート4: BOOLEANと数値の間のキャスト
BOOLEAN
から数値にキャストする場合:
-
ブール値がtrueの場合は、結果の値が1になります。
- ブール値がfalseの場合は、結果の値が0になります。
BOOLEAN
にキャストする場合:
-
数値がゼロ以外(1、2、-3、1.2など)の場合は、結果の値がtrueになります。
-
数値がゼロの場合は、結果の値がfalseになります。
ノート5: BOOLEANとCHAR(n)、NCHAR(n)の間のキャスト
BOOLEAN
からVARCHAR(n)
、NVARCHAR(n)
にキャストする場合-
ブール値がtrueのときに
n
が4以上の場合は、結果の値がtrueになります。 -
ブール値がfalseのときに
n
が5以上の場合は、結果の値がfalseになります。 -
それ以外の場合は、データの例外エラーが発生します。
ノート6: 文字列からブールへのキャスト
文字列からブールにキャストする場合は、最初に文字列の先頭と末尾の空白を切り捨てる必要があります。結果の文字列が有効なブール値の判定に使用された許容されるリテラルのいずれかであれば、結果はその有効なブール値になります。
名前付きコレクション型を別の名前付きコレクション型にキャストするには、両方のコレクションの要素が同じ型である必要があります。
関連項目:
-
Oracle Databaseで暗黙的にコレクション型データを文字データに変換する方法の詳細は、暗黙的なデータ変換の例を参照してください。また、データ変換のセキュリティ上の考慮事項を参照してください。
-
CAST
の戻り値が文字値である場合に、それに割り当てる照合を定義する照合導出ルールは、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Cを参照してください。
MULTISET
副問合せ
の結果セットが複数行に評価される可能性がある場合は、MULTISET
キーワードを指定する必要があります。副問合せの結果である行は、それらの行がキャストされたコレクション値の要素を形成します。MULTISET
キーワードを省略すると、副問合せはスカラー副問合せとして処理されます。
MULTISETの制限事項
MULTISET
キーワードを指定する場合、DEFAULT
return_value
ON
CONVERSION
ERROR
、fmt
またはnlsparam
句を指定することはできません。
DOMAIN
DOMAIN
句では、type_name
がドメインであることを指定します。type_name
は、ユーザーが実行権限を持つドメインの名前である必要があります。
domain_validate_clause
この句は、ドメイン・タイプにキャストする場合にのみ有効です。expr
をtype_name
に変換するときに、ドメイン制約を適用するかどうかを制御します。type_name
が制約のあるドメインであり、domain_validate_clause
が指定されていない場合、有効な制約がexpr
に適用されます。無効な制約は無視されます。
VALIDATE
ドメインの制約はすべて、状態に関係なくexpr
に適用されます。
NOVALIDATE
状態に関係なく、ドメイン制約はいずれもexpr
に適用されません。
DEFAULT return_value ON CONVERSION ERROR
この句を使用すると、expr
をtype_name
に変換するときにエラーが発生した場合、このファンクションによって戻される値を指定できます。expr
を評価するときにエラーが発生した場合、この句による影響はありません。
この句は、expr
がCHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
型の文字列に評価され、type_name
がBINARY_DOUBLE
、BINARY_FLOAT
、DATE
、INTERVAL
DAY
TO
SECOND
、INTERVAL
YEAR
TO
MONTH
、NUMBER
、TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
またはTIMESTAMP
WITH
LOCAL
TIME
ZONE
である場合に有効です。
return_value
は、文字リテラル、NULL、定数式またはバインド変数にすることができ、NULLに評価されるか、CHAR
、VARCHAR2
、NCHAR
、またはNVARCHAR2
型の文字列に評価される必要があります。return_value
をtype_name
に変換できない場合は、エラーが戻されます。
fmtおよびnlsparam
fmt
引数を使用すると書式モデルを指定でき、nlsparam
引数を使用するとNLSパラメータを指定できます。これらの引数を指定すると、expr
とreturn_value
が指定されている場合に、それらがtype_name
に変換されるときに適用されます。
fmt
およびnlsparam
は、type_name
が次のいずれかのデータ型である場合に指定できます。
-
BINARY_DOUBLE
BINARY_DOUBLE
を指定した場合、オプションのfmt
およびnlsparam
引数は、TO_BINARY_DOUBLE
関数の場合と同じ役割を果たします。詳細は、「TO_BINARY_DOUBLE」を参照してください。 -
BINARY_FLOAT
BINARY_FLOAT
を指定した場合、オプションのfmt
およびnlsparam
引数は、TO_BINARY_FLOAT
関数の場合と同じ役割を果たします。詳細は、「TO_BINARY_FLOAT」を参照してください。 -
DATE
DATE
を指定する場合、オプションのfmt
およびnlsparam
引数の用途はTO_DATE
ファンクションと同じです。詳細は、「TO_DATE」を参照してください。 -
NUMBER
NUMBER
を指定する場合、オプションのfmt
およびnlsparam
引数の用途はTO_NUMBER
ファンクションと同じです。詳細は、「TO_NUMBER」を参照してください。 -
TIMESTAMP
TIMESTAMP
を指定する場合、オプションのfmt
およびnlsparam
引数の用途はTO_TIMESTAMP
ファンクションと同じです。fmt
を指定しない場合、expr
は、NLS_TIMESTAMP_FORMAT
パラメータで明示的に決定されるか、またはNLS_TERRITORY
パラメータで暗黙的に決定されたTIMESTAMP
データ型のデフォルト書式である必要があります。詳細は、「TO_TIMESTAMP」を参照してください。 -
TIME
WITH
TIME
ZONE
TIMESTAMP
WITH
TIME
ZONE
を指定する場合、オプションのfmt
およびnlsparam
引数の用途はTO_TIMESTAMP_TZ
ファンクションと同じです。fmt
を指定しない場合、expr
は、NLS_TIMESTAMP_TZ_FORMAT
パラメータで明示的に決定されるか、またはNLS_TERRITORY
パラメータで暗黙的に決定されたTIMESTAMP
WITH
TIME
ZONE
データ型のデフォルト書式である必要があります。詳細は、「TO_TIMESTAMP_TZ」を参照してください。 -
TIMESTAMP
WITH
LOCAL
TIME
ZONE
TIMESTAMP
WITH
LOCAL
TIME
ZONE
を指定する場合、オプションのfmt
およびnlsparam
引数の用途はTO_TIMESTAMP
ファンクションと同じです。fmt
を指定しない場合、expr
は、NLS_TIMESTAMP_FORMAT
パラメータで明示的に決定されるか、またはNLS_TERRITORY
パラメータで暗黙的に決定されたTIMESTAMP
データ型のデフォルト書式である必要があります。詳細は、「TO_TIMESTAMP」を参照してください。
組込みデータ型の例
次の例では、CAST
ファンクションをスカラー・データ型とともに使用します。最初の例は、セッション・パラメータNLS_TIMESTAMP_FORMAT
に指定された書式モデルを使用して、テキストをタイムスタンプ値に変換します。このNLSパラメータに依存しないようにする場合は、2番目の例のようにTO_DATE
を使用できます。
SELECT CAST('22-OCT-1997' AS TIMESTAMP WITH LOCAL TIME ZONE) FROM DUAL; SELECT CAST(TO_DATE('22-Oct-1997', 'DD-Mon-YYYY') AS TIMESTAMP WITH LOCAL TIME ZONE) FROM DUAL;
前述の例では、TO_DATE
でテキストをDATE
に変換し、CAST
でDATE
をTIMESTAMP
WITH
LOCAL
TIME
ZONE
に変換して、セッション・タイムゾーン(SESSIONTIMEZONE
)の日付を求めています。
SELECT product_id, CAST(ad_sourcetext AS VARCHAR2(30)) text FROM print_media ORDER BY product_id;
次の例では、指定された値を指定されたデータ型に変換するときにエラーが発生した場合、デフォルト値が戻されます。これらの例では、エラーが発生することなく変換が行われます。
SELECT CAST(200 AS NUMBER DEFAULT 0 ON CONVERSION ERROR) FROM DUAL;
SELECT CAST('January 15, 1989, 11:00 A.M.' AS DATE DEFAULT NULL ON CONVERSION ERROR, 'Month dd, YYYY, HH:MI A.M.') FROM DUAL;
SELECT CAST('1999-12-01 11:00:00 -8:00' AS TIMESTAMP WITH TIME ZONE DEFAULT '2000-01-01 01:00:00 -8:00' ON CONVERSION ERROR, 'YYYY-MM-DD HH:MI:SS TZH:TZM', 'NLS_DATE_LANGUAGE = American') FROM DUAL;
次の例では、'N/A'
をNUMBER
値に変換するときにエラーが発生します。したがって、CAST
ファンクションにより、デフォルト値である0
が戻されます。
SELECT CAST('N/A' AS NUMBER DEFAULT '0' ON CONVERSION ERROR) FROM DUAL;
次の例では、データ型VARCHAR2
、NUMBER
をBOOLEAN
として変換します。
SELECT CAST ( 'yes' AS BOOLEAN ), CAST ( true AS NUMBER ), CAST ( false AS VARCHAR2(10) ) ; CAST('YES'ASBOOLEAN) CAST(TRUEASNUMBER) CAST(FALSE -------------------- ------------------ ---------- TRUE 1 FALSE
コレクションの例
後に続くCAST
の例は、サンプルの注文入力スキーマoe
で使用されているcust_address_typ
に基づいています。
CREATE TYPE address_book_t AS TABLE OF cust_address_typ; CREATE TYPE address_array_t AS VARRAY(3) OF cust_address_typ; CREATE TABLE cust_address ( custno NUMBER, street_address VARCHAR2(40), postal_code VARCHAR2(10), city VARCHAR2(30), state_province VARCHAR2(10), country_id CHAR(2)); CREATE TABLE cust_short (custno NUMBER, name VARCHAR2(31)); CREATE TABLE states (state_id NUMBER, addresses address_array_t);
次の例では、副問合せをキャストします。
SELECT s.custno, s.name, CAST(MULTISET(SELECT ca.street_address, ca.postal_code, ca.city, ca.state_province, ca.country_id FROM cust_address ca WHERE s.custno = ca.custno) AS address_book_t) FROM cust_short s ORDER BY s.custno;
CAST
では、VARRAY型の列をネストした表に変換します。
SELECT CAST(s.addresses AS address_book_t) FROM states s WHERE s.state_id = 111;
次の例では、この後に示す例で使用するオブジェクトを作成します。
CREATE TABLE projects (employee_id NUMBER, project_name VARCHAR2(10)); CREATE TABLE emps_short (employee_id NUMBER, last_name VARCHAR2(10)); CREATE TYPE project_table_typ AS TABLE OF VARCHAR2(10);
次のMULTISET
式の例は、前述のオブジェクトを使用します。
SELECT e.last_name, CAST(MULTISET(SELECT p.project_name FROM projects p WHERE p.employee_id = e.employee_id ORDER BY p.project_name) AS project_table_typ) FROM emps_short e ORDER BY e.last_name;
次の例では、文字列'yes'
をブール値に、ブール値true
をNUMBER
に、ブール値false
をVARCHAR2(10)
にキャストします:
SELECT CAST ( 'yes' AS BOOLEAN ), CAST ( true AS NUMBER ), CAST ( false AS VARCHAR2(10) ); CAST('YES'ASBOOLEAN) CAST(TRUEASNUMBER) CAST(FALSE -------------------- ------------------ ---------- TRUE 1 FALSE
ドメインの例
次の例では、CHECK制約が無効なドメインDAY_OF_WEEK
を作成します。最初の問合せではdomain_validate_clause
が省略されるため、制約状態を使用して値を検証するかどうかを判断します。これは無効になっていると、データベースは値をチェックしません。
2番目の問合せでは、VALIDATE
句を使用します。これにより、制約が無効になっている場合でも、制約が"N/A
"に適用されます。値"N/A
"は、制約によって許可されるリストにないため、CAST
によって例外が発生します。
CREATE DOMAIN day_of_week AS VARCHAR2(3 CHAR) CONSTRAINT CHECK (day_of_week IN('MON','TUE','WED','THU','FRI','SAT','SUN')) DISABLE;
SELECT CAST ( 'N/A' AS day_of_week ) use_constraint_state; USE_CONSTRAINT_STATE -------------------- N/A
SELECT CAST ( 'N/A' AS day_of_week VALIDATE ) apply_constraints; ORA-11513: CAST AS DOMAIN has failed due to domain constraints.
次の例では、CHECK制約が有効なドメインDAY_OF_WEEK
を作成します。最初の問合せではdomain_validate_clause
が省略されるため、制約状態を使用して値を検証するかどうかを判断します。これが有効になっていると、データベースは制約を"N/A
"に適用します。これは許可される値のリストにないため、CAST
によってエラーが発生します。
2番目の問合せでは、NOVALIDATE
句を使用します。制約が有効で、文がエラーなしで完了した場合でも、制約は無視されます。
CREATE DOMAIN day_of_week AS VARCHAR2(3 CHAR) CONSTRAINT CHECK (day_of_week IN('MON','TUE','WED','THU','FRI','SAT','SUN')) ENABLE;
SELECT CAST ( 'N/A' AS day_of_week ) use_constraint_state; ORA-11513: CAST AS DOMAIN has failed due to domain constraints.
SELECT CAST ( 'N/A' AS DOMAIN day_of_week NOVALIDATE ) ignore_constraints; IGNORE_CONSTRAINTS ------------------ N/A