본문 바로가기

[오라클 레퍼런스 함수] CAST - 타입(Type) 변환

by ㅇㅍㅍ 2023. 7. 31.
[오라클 레퍼런스 함수] CAST - 타입(Type) 변환
728x90

CAST

 

구문

CAST({ expr | MULTISET (subquery) } AS type_name
  [ DEFAULT return_value ON CONVERSION ERROR ]
  [, fmt [, 'nlsparam' ] ])

 

목적

CAST 함수를 사용하면 내장 데이터 유형 또는 컬렉션 유형의 값을 다른 내장 데이터 유형 또는 컬렉션 유형으로 변환할 수 있습니다. CAST 함수를 사용하여 무명의 피연산자(예: 날짜 또는 하위 쿼리의 결과 집합) 또는 명명된 컬렉션(예: varray 또는 중첩 테이블)을 타입 호환 데이터 유형 또는 명명된 컬렉션으로 변환할 수 있습니다. type_name은 내장 데이터 유형 또는 컬렉션 유형의 이름이어야 하며, 피연산자는 내장 데이터 유형이거나 컬렉션 값으로 평가되어야 합니다.

피연산자인 expr은 내장 데이터 유형, 컬렉션 유형 또는 ANYDATA 유형의 인스턴스일 수 있습니다. exprANYDATA 유형의 인스턴스인 경우, CASTANYDATA 인스턴스의 값을 추출하고, 이를 변환 대상 유형과 일치하는 경우 반환하며, 그렇지 않은 경우 NULL을 반환합니다. MULTISET은 Oracle Database에 서브쿼리의 결과 집합을 취하고 컬렉션 값으로 반환하도록 지시합니다. 표 7-1은 어떤 내장 데이터 유형을 어떤 다른 내장 데이터 유형으로 캐스트할 수 있는지를 보여줍니다. (CASTLONG, LONG RAW 또는 Oracle에서 제공하는 유형을 지원하지 않습니다.)

CAST 함수는 LOB 데이터 유형을 직접 지원하지 않습니다. CAST를 사용하여 CLOB 값을 문자 데이터 유형으로 또는 BLOB 값을 RAW 데이터 유형으로 변환할 때, 데이터베이스는 암시적으로 LOB 값을 문자 또는 RAW 데이터로 변환한 다음 결과 값을 목표 데이터 유형으로 명시적으로 캐스트합니다. 결과 값이 목표 유형보다 큰 경우 데이터베이스는 오류를 반환합니다.

CAST ... MULTISET을 사용하여 컬렉션 값을 가져오는 경우, CAST 함수에 전달되는 쿼리의 각 select list 항목이 대상 컬렉션 요소 유형의 해당 속성 유형으로 변환됩니다.

 

표 7-1 내장 데이터 유형의 캐스팅

Destination Data Type from BINARY_FLOAT, BINARY_DOUBLE from CHAR, VARCHAR2 from NUMBER/INTEGER from DATETIME / INTERVAL (Note 1) from RAW from ROWID, UROWID (Note 2) from NCHAR, NVARCHAR2
to BINARY_FLOAT, BINARY_DOUBLE X (Note 3) X (Note 3) X (Note 3) -- -- -- X (Note 3)
to CHAR, VARCHAR2 X X X X X X --
to NUMBER/INTEGER X (Note 3) X (Note 3) X (Note 3) -- -- -- X (Note 3)
to DATETIME/INTERVAL -- X (Note 3) -- X (Note 3) -- -- --
to RAW -- X -- -- X -- --
to ROWID, UROWID -- X -- -- -- X --
to NCHAR, NVARCHAR2 X -- X X X X X

노트 1: 날짜/시간 및 간격 데이터 유형은 DATE, TIMESTAMP, TIMESTAMP WITH TIMEZONE, TIMESTAMP WITH LOCAL TIME ZONE, INTERVAL DAY TO SECONDINTERVAL YEAR TO MONTH를 포함합니다.

노트 2: UROWID가 인덱스-조직화 테이블의 ROWID 값을 포함하는 경우 UROWIDROWID로 캐스팅할 수 없습니다.

노트 3: 이 유형의 변환에 대해 DEFAULT return_value ON CONVERSION ERROR 절을 지정할 수 있습니다. INTERVAL DAY TO SECOND로 변환하는 경우 fmt를 지정할 수 없으며, INTERVAL YEAR TO MONTH로 변환하는 경우 fmt 또는 nlsparam을 지정할 수 없습니다.

명명된 컬렉션 유형을 다른 명명된 컬렉션 유형으로 캐스팅하려면 두 컬렉션의 요소가 동일한 유형이어야 합니다.

 

참고:

 

MULTISET

서브쿼리의 결과 집합이 여러 행으로 평가되는 경우, MULTISET 키워드를 지정해야 합니다. 서브쿼리에서 생성된 행들은 그들이 캐스트되는 컬렉션 값의 요소가 됩니다. MULTISET 키워드를 사용하지 않으면, 서브쿼리는 스칼라 서브쿼리로 처리됩니다.

 

MULTISET에 대한 제한 사항

MULTISET 키워드를 지정한 경우, DEFAULT return_value ON CONVERSION ERROR, fmt, 또는 nlsparam 절을 지정할 수 없습니다.

 

DEFAULT return_value ON CONVERSION ERROR

이 절을 사용하면 exprtype_name으로 변환하는 동안 오류가 발생한 경우에 반환되는 값(return_value)을 지정할 수 있습니다. expr을 평가하는 동안 오류가 발생하는 경우에는 이 절이 영향을 미치지 않습니다.

이 절은 exprCHAR, VARCHAR2, NCHAR, 또는 NVARCHAR2 유형의 문자열을 평가하고, type_nameBINARY_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_valuetype_name으로 변환될 수 없는 경우, 함수는 오류를 반환합니다.

 

fmt과 nlsparam

fmt 인자를 사용하면 포맷 모델을 지정할 수 있으며, nlsparam 인자를 사용하면 NLS 파라미터를 지정할 수 있습니다. 이러한 인자들을 지정하면 expr과 (만약 지정된 경우) return_valuetype_name으로 변환할 때 적용됩니다.

type_name이 다음 데이터 유형 중 하나인 경우에 fmtnlsparam을 지정할 수 있습니다:

 

  • BINARY_DOUBLE
    BINARY_DOUBLE을 지정한 경우, 선택적인 fmtnlsparam 인자는 TO_BINARY_DOUBLE 함수와 같은 목적으로 사용됩니다. 자세한 내용은 TO_BINARY_DOUBLE을 참조하세요.

  • BINARY_FLOAT
    BINARY_FLOAT을 지정한 경우, 선택적인 fmtnlsparam 인자는 TO_BINARY_FLOAT 함수와 같은 목적으로 사용됩니다. 자세한 내용은 TO_BINARY_FLOAT을 참조하세요.

  • DATE
    DATE를 지정한 경우, 선택적인 fmtnlsparam 인자는 TO_DATE 함수와 같은 목적으로 사용됩니다. 자세한 내용은 TO_DATE를 참조하세요.

  • NUMBER
    NUMBER를 지정한 경우, 선택적인 fmtnlsparam 인자는 TO_NUMBER 함수와 같은 목적으로 사용됩니다. 자세한 내용은 TO_NUMBER를 참조하세요.

  • TIMESTAMP
    TIMESTAMP를 지정한 경우, 선택적인 fmtnlsparam 인자는 TO_TIMESTAMP 함수와 같은 목적으로 사용됩니다. 만약 fmt를 생략하면 exprTIMESTAMP 데이터 유형의 기본 형식이어야 합니다. 기본 형식은 명시적으로 NLS_TIMESTAMP_FORMAT 파라미터나 묵시적으로 NLS_TERRITORY 파라미터에 의해 결정됩니다. 자세한 내용은 TO_TIMESTAMP를 참조하세요.

  • TIMESTAMP WITH TIME ZONE
    TIMESTAMP WITH TIME ZONE을 지정한 경우, 선택적인 fmtnlsparam 인자는 TO_TIMESTAMP_TZ 함수와 같은 목적으로 사용됩니다. 만약 fmt를 생략하면 exprTIMESTAMP WITH TIME ZONE 데이터 유형의 기본 형식이어야 합니다. 기본 형식은 명시적으로 NLS_TIMESTAMP_TZ_FORMAT 파라미터나 묵시적으로 NLS_TERRITORY 파라미터에 의해 결정됩니다. 자세한 내용은 TO_TIMESTAMP_TZ를 참조하세요.

  • TIMESTAMP WITH LOCAL TIME ZONE
    TIMESTAMP WITH LOCAL TIME ZONE을 지정한 경우, 선택적인 fmtnlsparam 인자는 TO_TIMESTAMP 함수와 같은 목적으로 사용됩니다. 만약 fmt를 생략하면 exprTIMESTAMP 데이터 유형의 기본 형식이어야 합니다. 기본 형식은 명시적으로 NLS_TIMESTAMP_FORMAT 파라미터나 묵시적으로 NLS_TERRITORY 파라미터에 의해 결정됩니다. 자세한 내용은 TO_TIMESTAMP를 참조하세요.

 

내장 데이터 유형 예제

다음 예제들은 CAST 함수를 스칼라 데이터 유형과 함께 사용하는 방법을 보여줍니다. 첫 번째 예제는 세션 파라미터인 NLS_TIMESTAMP_FORMAT에서 제공된 포맷 모델을 적용하여 텍스트를 타임스탬프 값으로 변환합니다. 이 NLS 파라미터에 의존하지 않고 변환하고 싶다면 두 번째 예제처럼 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 함수는 DATETIMESTAMP 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 유형의 컬럼을 nested table로 변환합니다:

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;

 


출처: 오라클 레퍼런스

원문 링크: Oracle CAST 함수 문서

 

반응형

댓글