소문자 테이블 문제

테이블명이 소문자 영문명으로 지정이 되는가? 

오라클 DICTIONARY 테이블에서 조회 할 경우에 테이블명은 모두 대문자로 조회합니다.
테이블 생성시 소문자를 하더라도, 대문자로 데이터 처리가 되기 때문입니다.
그래서 DBA들이 내부적으로 조회, 스크립트를 만들때 UPPER( 테이블명 ) 함수를 사용할일이 없습니다.

그런데 프로젝트에서 우연히 발견된 "소문자 테이블"!
어림짐작해 보니 쌍따옴표를 붙여 "테이블명소문자"로 테스트 해보니 소문자로 테이블이 만들어지네요.

테스트를 위해 TEST_UPPER,  LOWER,  "lower" 문자열로 테이블을 생성해봅니다. 


[ 실 습 ]

 

 

1. 테이블 생성

CREATE TABLE TEST_UPPER ( col1 varchar2(100) );
​CREATE TABLE LOWER ( col1 varchar2(100) );
CREATE TABLE "lower" ( col1 varchar2(100) );

 

 

2. TABLE DICTIONARY VIEW 조회 

​select * from dba_tables where table_naME in ( 'TEST_UPPER','LOWER','lower' ) ;

생성된 소문자 테이블 생성

 

 

3. TABLE DROP 하기

DROP TABLE TEST_UPPER PURGE;
DROP TABLE LOWER PURGE;
DROP TABLE lower PURGE;  --  테이블이 존재하지 않는다고함( LOWER = lower 동일하게 봄)
DROP TABLE "lower" PURGE;  --  " " 쌍따옴표를 이용하여 소문자 테이블 삭제 
DROP TABLE lower ; 수행 결과

 

 

4. 소문자 테이블로 인한 문제점 
  : 원하는 결과에서 소문자 테이블이 제외되는 사항이 발생될 수 있으므로 소문자 테이블 사용은 금지!

  1) ALTER, DROP 등 DDL 구문으로 처리하는 스크립트를 만들경우
    - 소유자."테이블명" 으로 해야하기 때문에 비효율.
    - DROP TABLE 소유자."소문자테이블"로 처리해야함.
  2) 대,소문자로 구분되지만 같은 테이블명 존재 가능성.
  3) 소문자 테이블 조회 "" 필수
   - SELECT * FROM 소유자."소문자테이블";