Posts

SQL*Plus에서 '&'가 포함된 문자열을 변수로 인식하지 않게 하기

문자열 자체에 &가 포함되어 있는 경우 SQL*Plus에서 & 뒤의 단어를 변수로 인식해 그에 대한 값의 입력을 요구한다.

Read more...

LONG형 컬럼을 가진 테이블의 테이블스페이스 이동

테이블을 다른 테이블스페이스로 옮기려면 다음과 같이 한다.

ALTER TABLE t MOVE TABLESPACE ts_name;

그러나 LONG형 컬럼을 포함하고 있는 테이블에 위 명령을 실행하면 ora-00997 에러가 발생한다. CTAS를 사용해 테이블 복사를 시도해도 같은 에러가 발생한다.

Read more...

SQL*Plus 프롬프트 설정

SQL*Plus의 프롬프트를 username@INSTANCE_NAME >과 같은 식으로 설정하면 현재 로그인한 인스턴스와 사용자 이름을 확인할 수 있어 편하다. logn.sql 스크립트를 만들어 여기에 프롬프트 설정 코드를 넣어두면 된다. Effective Oracle 책(p79)에는 설정 코드가 조금 복잡하게 나와 있다.

Read more...

인덱스 중복과 클러스터링 팩터

테이블 T에 다음과 같은 인덱스가 있다면 ix01은 삭제해야 한다고 생각했다.

  • ix01: a
  • ix02: a+b

ix02을 이용하면 ix01을 사용해야 하는 경우를 모두 포괄할 수 있으니 ix02만 남겨놓고 나머지는 삭제하는 것이 맞다고 생각했던 것이다. 그러나 문제가 항상 그렇게 단순하지만은 않은 듯 하다.

Read more...

DB 링크 삭제 시 제약사항

불필요한 데이터베이스 링크가 난무하는 것 같아 정리하기로 마음을 먹었다. 일단 개발DB에서 운영DB로의 데이터베이스 링크는 허용할 수 없으므로 이것부터 삭제하기로 했다. 개발DB에 sys 계정으로 로그인한 다음 dba_db_links 테이블을 조회해 개발DB에서 운영DB로 연결되는 데이터베이스 링크를 하나씩 확인했다.

Read more...

Oracle XDB 비활성화 방법

Oracle9i부터는 XML DB가 포함되어 있는데, 이 녀석은 HTTP/WebDAV과 FTP 포트로 각각 80802100 포트를 사용한다. 데이터베이스 서버에 Oracle만 실행 중이라면 XML DB가 떠있다고 해서 당장 문제될 것이 없으니 그냥 무시할 수도 있다(보안을 생각한다면 내려야 하겠지만). 개발 서버나 테스트 서버의 경우 8080 포트를 쓰는 다른 서버 프로그램(가령 Tomcat 같은)을 띄워야 하는 경우 포트가 충돌해 문제가 발생할 수 있다. Oracle9i에는 그나마 DBCA를 이용해 DB를 생성할 때 XML DB를 제외할 수 있는 옵션이 있었던 것 같은데, 10g에는 그 옵션이 사라져버렸다.

Read more...

하지 말 것 목록

  1. 사용자로부터 문자열 리터럴을 입력받아 SQL을 만들지 말 것. (eg: 항상 바인드 변수를 사용할 것)
  2. 데이터가 없는 상태 또는 실제 시스템의 극히 일부 데이터만 있는 상태에서 테스트하지 말 것. 실제 시스템의 통계 정보를 불러들이는 것도 소용 없음. 실제로 어떻게 되는지를 보려면 실제 만큼의 데이터가 필요함.

Read more...

DBMS_RANDOM 패키지 사용법

랜덤한 숫자나 문자열을 만들 때 DBMS_RANDOM 패키지를 사용하면 된다.

Read more...

set timing을 이용한 SQL 실행 속도 측정법

SQL*Plus에서 실행시킨 SQL 또는 PL/SQL 블록의 실행속도를 보려면 다음과 같이 set timing on을 사용하면 된다.

Read more...

TIMESTAMP 컬럼으로 파티션 하는 방법

일반적으로 range 파티션 테이블을 만들 때는 다음과 같이 한다.

Read more...