더북(TheBook)

01 | 동적 SQL이 필요한 이유

과연 실행할 때마다 SQL문장이 달라질 때가 있기는 할까? 물론이다. 실행 시점에 따라 SELECT절의 컬럼 수가 변동되거나 WHERE절 조건이 달라질 때가 있을 수 있다. 동적 SQL이 사용되는 가장 흔한 경우는 바로 WHERE 조건이 변할 때다. 예를 들어, 조회 조건이 10개가 넘는 화면이 있는데 매번 이 모든 조건을 입력해서 조회하는 일은 실제로 매우 드물다. 사용자가 화면 상의 조회버튼을 클릭했을 때 10개의 조회 조건 모두를 체크한다면 WHERE절의 조건은 총 10개가 되겠지만 모든 조회 조건을 입력해 조회하는 사용자는 극히 드물고 기껏해야 4~5가지 조건을 입력할 텐데, 문제는 조회할 때마다 조회 조건이 매번 달라질 수 있다는 점이다. 따라서 입력된 조회 조건만 적용해 SQL 문장을 만든다면 매우 간단해질 것이다. 이처럼 동적으로, 그때그때마다 SQL 문장이 달라질 수 있는 상황에서 동적 SQL을 사용한다. 이 외에도 동적 SQL을 사용해야 하는 상황을 정리해 보면 다음과 같다.

하나, 컴파일 시에 SQL 문장이 확정되지 않는 경우

위에서 예로 든 것처럼 WHERE 조건 뿐만 아니라 SELECT 항목이 동적으로 변할 수 있는 상황에서 동적 SQL을 가장 많이 사용한다.

둘, PL/SQL 블록 상에서 DB문을 실행해야 할 경우

익명 블록이나 함수, 프로시저, 패키지 본문에서는 DDL문(CREATE, DROP, ALTER, TRUNCATE)을 실행할 수 없다. 물론, PL/SQL 블록에서 DDL문을 실행해야 하는 상황 자체가 거의 없긴 하지만, TRUNCATE문은 종종 사용하기도 한다. 이때 동적 SQL을 이용하면 PL/SQL 블록 내에서도 DDL문을 실행할 수 있다.

셋. PL/SQL 블록 상에서 ALTER SYSTEM/SESSION 명령어를 실행해야 할 경우

오라클에는 각종 시스템과 세션 파라미터를 제공한다. 예를 들어, NLS_LANG은 언어 정보, NLS_DATE_FORMAT은 날짜형식 정보가 들어 있다. 이 같은 파라미터는 그 성격에 따라 시스템 혹은 세션별로 값을 설정할 수 있는데, 세션별 파라미터 값을 수정하는 명령어가 바로 ALTER SESSION 명령어다. 이 명령어 역시 DDL문과 마찬가지로 PL/SQL 상에서는 직접 사용할 수 없지만, 동적 SQL을 이용하면 사용할 수 있다.

대략 위와 같은 3가지 상황이 발생했을 때는 동적 SQL 사용을 고려해 봐야 한다. 그럼 지금부터 동적 SQL에 대해 집중적으로 파헤쳐 보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.