構文
用途
CAST
は、ある組込みデータ型またはコレクション型の値を、別の組込みデータ型またはコレクション型の値に変換します。
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構文のリストのアイテムは、ターゲットのコレクション要素型に対応する属性型に変換されます。
表7-1 組込みデータ型のキャスト
BINARY_FLOAT、BINARY_DOUBLEから | CHAR、VARCHAR2から | NUMBERから | DATETIME/INTERVALから(注1) | RAWから | ROWID、UROWIDから(注2) | NCHAR、NVARCHAR2から | |
---|---|---|---|---|---|---|---|
BINARY_FLOAT、BINARY_DOUBLEへ |
|
|
|
|
|
|
|
CHAR、VARCHAR2へ |
|
|
|
|
|
|
|
NUMBERへ |
|
|
|
|
|
|
|
DATE、TIMESTAMP、INTERVALへ |
|
|
|
|
|
|
|
RAWへ |
|
|
|
|
|
|
|
ROWID、UROWIDへ |
|
|
|
|
|
|
|
NCHAR、NVARCHAR2へ |
|
|
|
|
|
|
|
注1: Datetime/Intervalには、DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIMEZONE
、INTERVAL
DAY
TO
SECOND
およびINTERVAL
YEAR
TO
MONTH
が含まれます。
注2: UROWID
が索引構成表のROWID
の値を含んでいる場合、UROWID
をROWID
にキャストすることはできません。
名前付きコレクション型を別の名前付きコレクション型にキャストするには、両方のコレクションの要素が同じ型である必要があります。
副問合せ
の結果セットが複数行に評価される可能性がある場合は、MULTISET
キーワードを指定する必要があります。副問合せの結果である行は、それらの行がキャストされたコレクション値の要素を形成します。MULTISET
キーワードを省略すると、副問合せはスカラー副問合せとして処理されます。
組込みデータ型の例
次の例では、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;
コレクションの例
後に続く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;