무한 row 생성 쿼리

Oracle에서는 다음과 같이 connect by절을 사용해 원하는 만큼 row를 만들어낼 수 있다.

Read more...

오라클에서 factorial 구하기

오라클에 factorial 함수가 없지만 다음과 같이 구할 수 있다.

Read more...

인덱스 비교

개발DB와 테스트DB, 또는 테스트DB와 운영DB간 인덱스를 비교할 때는 다음 쿼리를 사용할 수 있다.

Read more...

테이블 비교

프로젝트를 하다보면 개발DB와 테스트DB 또는 테스트DB와 운영DB간 스키마를 비교해 차이점이 없는지 확인할 일이 많다. 다음은 테이블과 컬럼을 비교하는 스크립트다.

Read more...

db_files 개수에 포함되는 파일은?

현재 우리 운영DB는 db_files 파라미터 값이 매우 작게 잡혀있다. 따라서 빨리 값을 늘려줘야 하는데, 당장 운영중인 DB를 내리고 파라미터 값을 바꿀 수는 없다. 그런데 여기서 궁금증 하나 생겼다. db_files는 데이터 파일 개수만 제한하는 것일까, 아니면 temp 파일도 여기에 포함되는 것일까? 혹시 온라인 리두로그는? 혹시 컨트롤 파일도 포함되는 것일까?

Read more...

SELECT 결과를 shell 변수로 가져오기

select한 결과를 shell에서 참조해야 하는 경우 다음과 같이 하면 된다.

Read more...

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...