日本語PDF

CAST

構文

目的

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

オペランドでは、exprは組込みデータ型、コレクション型またはANYDATA型のインスタンスのいずれかです。exprANYDATA型のインスタンスである場合、CASTANYDATAインスタンスの値を抽出し、その値がキャスト対象の型と一致する場合はその値を戻し、一致しない場合は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/INTEGERから DATETIME/INTERVALから(ノート1) RAWから ROWID、UROWIDから(ノート2) NCHAR、NVARCHAR2から

BINARY_FLOAT、BINARY_DOUBLEへ

X (ノート3)

X (ノート3)

X (ノート3)

--

--

--

X (ノート3)

CHAR、VARCHAR2へ

X

X

X

X

X

X

--

NUMBER/INTEGERへ

X (ノート3)

X (ノート3)

X (ノート3)

--

--

--

X (ノート3)

DATETIME/INTERVALへ

--

X (ノート3)

--

X (ノート3)

--

--

--

RAWへ

--

X

--

--

X

--

--

ROWID、UROWIDへ

--

X

--

--

--

X

--

NCHAR、NVARCHAR2へ

X

--

X

X

X

X

X

ノート1: DATETIME/INTERVALには、DATETIMESTAMPTIMESTAMP WITH TIMEZONETIMESTAMP WITH LOCAL TIME ZONEINTERVAL DAY TO SECONDおよびINTERVAL YEAR TO MONTHが含まれます。

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

ノート3: このタイプの変換には、DEFAULT return_value ON CONVERSION ERROR句を指定できます。このタイプの変換には、fmtおよびnlsparam句を指定できます。例外として、INTERVAL DAY TO SECONDに変換する際にはfmtを指定することはできず、INTERVAL YEAR TO MONTHに変換する際にはfmtまたはnlsparamを指定することはできません。

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

関連項目:

MULTISET

副問合せの結果セットが複数行に評価される可能性がある場合は、MULTISETキーワードを指定する必要があります。副問合せの結果である行は、それらの行がキャストされたコレクション値の要素を形成します。MULTISETキーワードを省略すると、副問合せはスカラー副問合せとして処理されます。

MULTISETの制限事項

MULTISETキーワードを指定する場合、DEFAULT return_value ON CONVERSION ERRORfmtまたはnlsparam句を指定することはできません。

DEFAULT return_value ON CONVERSION ERROR

この句を使用すると、exprtype_nameに変換するときにエラーが発生した場合、このファンクションによって戻される値を指定できます。exprを評価するときにエラーが発生した場合、この句による影響はありません。

この句は、exprCHARVARCHAR2NCHARまたはNVARCHAR2型の文字列に評価され、type_nameBINARY_DOUBLEBINARY_FLOATDATEINTERVAL DAY TO SECONDINTERVAL YEAR TO MONTHNUMBERTIMESTAMPTIMESTAMP WITH TIME ZONEまたはTIMESTAMP WITH LOCAL TIME ZONEである場合に有効です。

return_valueは、文字リテラル、NULL、定数式またはバインド変数にすることができ、NULLに評価されるか、CHARVARCHAR2NCHAR、またはNVARCHAR2型の文字列に評価される必要があります。return_valuetype_nameに変換できない場合は、エラーが戻されます。

fmtおよびnlsparam

fmt引数を使用すると書式モデルを指定でき、nlsparam引数を使用するとNLSパラメータを指定できます。これらの引数を指定すると、exprreturn_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に変換し、CASTDATETIMESTAMP 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;

コレクションの例

後に続く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;