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_DOUBLEBINARY_DOUBLEを指定した場合、オプションのfmtおよびnlsparam引数は、TO_BINARY_DOUBLE関数の場合と同じ役割を果たします。詳細は、「TO_BINARY_DOUBLE」を参照してください。 -
BINARY_FLOATBINARY_FLOATを指定した場合、オプションのfmtおよびnlsparam引数は、TO_BINARY_FLOAT関数の場合と同じ役割を果たします。詳細は、「TO_BINARY_FLOAT」を参照してください。 -
DATEDATEを指定する場合、オプションのfmtおよびnlsparam引数の用途はTO_DATEファンクションと同じです。詳細は、「TO_DATE」を参照してください。 -
NUMBERNUMBERを指定する場合、オプションのfmtおよびnlsparam引数の用途はTO_NUMBERファンクションと同じです。詳細は、「TO_NUMBER」を参照してください。 -
TIMESTAMPTIMESTAMPを指定する場合、オプションのfmtおよびnlsparam引数の用途はTO_TIMESTAMPファンクションと同じです。fmtを指定しない場合、exprは、NLS_TIMESTAMP_FORMATパラメータで明示的に決定されるか、またはNLS_TERRITORYパラメータで暗黙的に決定されたTIMESTAMPデータ型のデフォルト書式である必要があります。詳細は、「TO_TIMESTAMP」を参照してください。 -
TIMEWITHTIMEZONETIMESTAMPWITHTIMEZONEを指定する場合、オプションのfmtおよびnlsparam引数の用途はTO_TIMESTAMP_TZファンクションと同じです。fmtを指定しない場合、exprは、NLS_TIMESTAMP_TZ_FORMATパラメータで明示的に決定されるか、またはNLS_TERRITORYパラメータで暗黙的に決定されたTIMESTAMPWITHTIMEZONEデータ型のデフォルト書式である必要があります。詳細は、「TO_TIMESTAMP_TZ」を参照してください。 -
TIMESTAMPWITHLOCALTIMEZONETIMESTAMPWITHLOCALTIMEZONEを指定する場合、オプションの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

