
1. ROWID란 무엇인가?
Oracle에서 ROWID는 데이터베이스 내 특정 행(row)의 고유한 물리적 주소를 나타냅니다. 이는 테이블 내에서 행을 유일하게 식별할 수 있는 값이며, Oracle 내부적으로는 검색 성능을 높이기 위해 자주 사용됩니다. ROWID는 다음 네 가지 구성 요소로 이뤄집니다:
- 데이터 오브젝트 번호
- 데이터 파일 번호
- 블록 번호
- 행 번호
2. ROWIDTOCHAR 함수란?
ROWIDTOCHAR 함수는 ROWID 값을 CHAR 데이터 형식으로 변환하는 Oracle 내장 함수입니다. 이 함수는 ROWID 값을 문자열로 표현할 수 있게 하여, 로그 기록이나 디버깅, 외부 시스템 연동 시 유용하게 사용됩니다.
ROWIDTOCHAR(rowid)
입력값: ROWID
반환값: CHAR(18)
3. 기본 사용 예제
다음 예제는 ROWID 값을 CHAR 형식으로 변환하는 가장 기본적인 사용법입니다.
SELECT ROWID, ROWIDTOCHAR(ROWID) AS rowid_char, EMPLOYEE_NAME
FROM EMPLOYEES;
위 결과는 각 행의 물리적 주소(ROWID)와 그 주소를 문자형으로 변환한 결과를 함께 보여줍니다.
4. 실무 활용 예제
4-1. 중복 행 추적
중복 데이터 제거 시 특정 행을 고유하게 식별하기 위해 ROWIDTOCHAR를 사용할 수 있습니다.
SELECT ROWIDTOCHAR(ROWID) AS row_id, NAME, COUNT(*)
FROM CUSTOMERS
GROUP BY ROWIDTOCHAR(ROWID), NAME
HAVING COUNT(*) > 1;
4-2. 로그 저장 시 ROWID 기록
오류 발생 시 해당 데이터 행을 추적하기 위해 로그 테이블에 ROWIDTOCHAR 값을 저장하는 방식입니다.
INSERT INTO ERROR_LOG (ERROR_MESSAGE, ROW_IDENTIFIER)
SELECT '데이터 이상', ROWIDTOCHAR(ROWID)
FROM ORDERS
WHERE ORDER_STATUS = 'INVALID';
5. ROWIDTOCHAR vs CHARTOROWID
ROWIDTOCHAR와 반대 역할을 하는 함수가 CHARTOROWID입니다. 이 두 함수는 상호 변환이 가능하며, 외부 입력값을 내부 ROWID로 변환할 때 유용합니다.
-- 문자형 ROWID 값을 다시 ROWID로 변환
SELECT CHARTOROWID('AAARaWAAEAAAAFmAAR') FROM DUAL;
| 항목 | ROWIDTOCHAR | CHARTOROWID |
|---|---|---|
| 기능 | ROWID → CHAR | CHAR → ROWID |
| 사용 목적 | 로깅, 디버깅, 외부 전달 | ROWID 기반 쿼리 작성 |
| 반환값 | CHAR(18) | ROWID |
6. 주의사항
- ROWIDTOCHAR로 변환한 값은 물리적 주소를 반영하므로, 데이터 이동이나 재구성 시 변할 수 있음.
- ROWID는 인덱스가 아닌 물리적 위치 기반이므로, 데이터 변경이 잦은 테이블에서는 활용 주의.
- ROWID는 테이블 간 JOIN 조건으로 사용하지 않는 것이 바람직함.
7. 결론
Oracle의 ROWIDTOCHAR 함수는 데이터베이스 행의 고유 식별을 문자형으로 처리하고자 할 때 매우 유용한 도구입니다. 디버깅, 로그 저장, 중복 처리 등 다양한 실무 시나리오에서 활용 가능하며, CHARTOROWID와 함께 사용하면 강력한 데이터 추적 시스템을 구축할 수 있습니다. 개발자는 이러한 시스템 함수의 개념과 특징을 정확히 이해하고, 실전에서 상황에 맞게 적용할 수 있어야 합니다.
출처
- Oracle 공식 문서: https://docs.oracle.com/en/
- Oracle Database SQL Language Reference (ROWID Functions)
- 실무 경험 기반 예제 및 테스트 쿼리
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] NVL() 함수로 NULL 값을 기본 값으로 바꾸는 방법 (0) | 2025.06.07 |
|---|---|
| [ORACLE] NVL2() 함수로 NULL 유무에 따른 조건 처리 쉽게 구현하기 (0) | 2025.06.07 |
| [ORACLE] CHARTOROWID() 함수 완벽 가이드 : 문자형 ROWID를 ROWID로 변환 (0) | 2025.06.06 |
| [ORACLE] RAWTOHEX() 함수 실무 활용 법 : 해시 값, 토큰 비교에 강력한 이유 (0) | 2025.06.06 |
| [ORACLE] HEXTORAW() 함수 완전 정복 : 16진수 → RAW 변환 실무 가이드 (0) | 2025.06.06 |