プライマリ・コンテンツに移動
Oracle® Database SQL言語リファレンス
11gリリース2 (11.2)
B56299-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

CAST

構文

cast.gifの説明が続きます。
図「cast.gif」の説明

用途

CASTは、ある組込みデータ型またはコレクション型の値を、別の組込みデータ型またはコレクション型の値に変換します。

CASTを使用すると、ある組込みデータ型またはコレクション型の値を、別の組込みデータ型またはコレクション型に変換できます。名前のないオペランド(日付や副問合せの結果セットなど)または名前付きのコレクション(VARRAYやネストした表など)を型互換のデータ型または名前付きコレクションにキャストできます。type_nameは、組込みデータ型またはコレクション型の名前である必要があり、オペランドは、組込みデータ型であるか、またはその値がコレクション値である必要があります。

オペランドでは、exprは組込みデータ型、コレクション型またはANYDATA型のインスタンスのいずれかです。exprANYDATA型のインスタンスである場合、CASTANYDATAインスタンスの値を抽出し、その値がキャスト対象の型と一致する場合はその値を戻し、一致しない場合はNULLを戻します。MULTISETは、副問合せの結果セットを取り、コレクション値を戻すようにOracle Databaseに通知します。表5-1に、どの組込みデータ型が、どの組込みデータ型にキャストできるかを示します。(CASTは、LONG型、LONG RAW型、またはOracleが提供する型をサポートしていません。)

CASTは、LOBデータ型のいずれも直接的にサポートしていません。CASTを使用して、CLOB値を文字データ型に変換するか、BLOB値をRAWデータ型に変換すると、データベースは暗黙的にLOB値を文字またはRAWデータに変換し、結果値を明示的にターゲットのデータ型にキャストします。結果値がターゲットの型より大きい場合、エラーが戻されます。

CAST ... MULTISETを使用してコレクション値を取得すると、CASTファンクションに渡される問合せ内のSELECT構文のリストのアイテムは、ターゲットのコレクション要素型に対応する属性型に変換されます。

表5-1 組込みデータ型のキャスト


BINARY_FLOAT、BINARY_DOUBLEから CHAR、VARCHAR2から NUMBERから DATETIME/INTERVALから(注1) RAWから ROWID、UROWIDから(注2) NCHAR、NVARCHAR2から

BINARY_FLOAT、BINARY_DOUBLEへ

X

X

X

--

--

--

X

CHAR、VARCHAR2へ

X

X

X

X

X

X

--

NUMBERへ

X

X

X

--

--

--

X

DATE、TIMESTAMP、INTERVALへ

--

X

--

X

--

--

--

RAWへ

--

X

--

--

X

--

--

ROWID、UROWIDへ

--

X

--

--

--

X

--

NCHAR、NVARCHAR2へ

X

--

X

X

X

X

X


注1: Datetime/Intervalには、DATETIMESTAMPTIMESTAMP WITH TIMEZONEINTERVAL DAY TO SECONDおよびINTERVAL YEAR TO MONTHが含まれます。

注2: UROWIDが索引構成表のROWIDの値を含んでいる場合、UROWIDROWIDにキャストすることはできません。

名前付きコレクション型を別の名前付きコレクション型にキャストするには、両方のコレクションの要素が同じ型である必要があります。


関連項目:

Oracle Databaseで暗黙的にコレクション型データを文字データに変換する方法については、「暗黙的なデータ変換」および「データ変換のセキュリティ上の考慮事項」を参照してください。

副問合せの結果セットが複数行に評価される可能性がある場合は、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に変換し、CASTDATETIMESTAMP 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;