태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

RAW 값 변환하기

오라클/프로그래밍 2010.10.12 16:26
딕셔너리를 검색하다 보면 RAW 형태로 제공되는 값들이 간혹 있습니다. 가령 USER_TAB_COLS 뷰에서 컬럼의 최소값과 최대값을 조회해보면 다음과 같이 의미를 알 수 없는 RAW 값으로 보여집니다.
SQL> col column_name format a10
SQL> col data_type format a10
SQL> select
  2  	column_name,
  3  	data_type,
  4  	low_value,
  5  	high_value
  6  from
  7  	user_tab_cols
  8  where
  9  	table_name = 'T1'
 10  ;

COLUMN_NAM DATA_TYPE  LOW_VALUE            HIGH_VALUE
---------- ---------- -------------------- --------------------
C1         NUMBER     C102                 C302
C2         VARCHAR2   6D616E79             6F6E65
이 값들은 UTL_RAW 패키지를 사용하면 변환할 수 있습니다.
SQL> select utl_raw.cast_to_number('C102') from dual;

UTL_RAW.CAST_TO_NUMBER('C102')
------------------------------
                             1

SQL> select utl_raw.cast_to_varchar2('6D616E79') from dual;

UTL_RAW.CAST_TO_VARCHAR2('6D616E79')
--------------------------------------------------------------------------------
many
다음과 같이 사용할 수 있겠네요.
SQL> select
  2  	column_name,
  3  	data_type,
  4  	decode(data_type,
  5  		'NUMBER', utl_raw.cast_to_number(low_value)||'',
  6  		'VARCHAR2', utl_raw.cast_to_varchar2(low_value), low_value||'') as low_value,
  7  	decode(data_type,
  8  		'NUMBER', utl_raw.cast_to_number(high_value)||'',
  9  		'VARCHAR2', utl_raw.cast_to_varchar2(high_value), high_value||'') as high_value
 10  from
 11  	user_tab_cols
 12  where
 13  	table_name = 'T1'
 14  ;

COLUMN_NAM DATA_TYPE  LOW_VALUE            HIGH_VALUE
---------- ---------- -------------------- --------------------
C1         NUMBER     1                    10000
C2         VARCHAR2   many                 one
DBMS_STATS 패키지도 동일한 역할을 하는 함수들을 제공합니다. 하지만 인자를 지정하는 방법이 조금 다릅니다. 사용의 편의성을 위해서 다음과 같이 사용자 정의 함수를 만듭니다.
SQL> -- dbms_stats (conversion)
SQL> create or replace function convert_me(p_value in raw, p_type in varchar2)
  2  return varchar2
  3  is
  4     v_number		number;
  5     v_varchar2   varchar2(4000);
  6  begin
  7     if (p_type = 'NUMBER') then
  8        dbms_stats.convert_raw_value(p_value, v_number);
  9        return v_number|| '';
 10     elsif (p_type = 'VARCHAR2') then
 11        dbms_stats.convert_raw_value(p_value,v_varchar2);
 12        return v_varchar2;
 13     /* other data types */
 14     else
 15        return p_value || '';
 16     end if;
 17  end;
 18  /

Function created.

SQL> 
SQL> select convert_me('C102', 'NUMBER') from dual;

CONVERT_ME('C102','NUMBER')
--------------------------------------------------------------------------------
1

SQL> select convert_me('6D616E79', 'VARCHAR2') from dual;

CONVERT_ME('6D616E79','VARCHAR2')
--------------------------------------------------------------------------------
many
그러면 다음과 같이 SQL 문장내에서 사용할 수 있습니다.
SQL> select
  2  	column_name,
  3  	data_type,
  4  	convert_me(low_value, data_type) as low_value,
  5  	convert_me(high_value, data_type) as high_value
  6  from
  7  	user_tab_cols
  8  where
  9  	table_name = 'T1'
 10  ;

COLUMN_NAM DATA_TYPE  LOW_VALUE            HIGH_VALUE
---------- ---------- -------------------- --------------------
C1         NUMBER     1                    10000
C2         VARCHAR2   many                 one
위와 같은 일을 하지 않아도 되게끔 오라클이 알아서 변환해주면 좋을텐데요. 하여간 간혹 위와 같은 변환 작업이 필요한 경우가 있습니다. 그때 잘 활용하면 좋겠습니다.
저작자 표시
신고

'오라클 > 프로그래밍' 카테고리의 다른 글

RAW 값 변환하기  (0) 2010.10.12
Trackback 0 : Comment 0

Write a comment

티스토리 툴바