티스토리 뷰

반응형

문자열 형태로 SQL를 작성하고 DBMS에 Call할때 이때의 SQL를 Dynamic SQL
이라고 합니다. 그러면 Dynamic SQL은 언제 사용할까요?
아래의 경우에 사용합니다.

첫째. Analytic Function(분석함수)를 사용할 경우
둘째, Scalar Sub query를 사용할 경우
셌재. 테이블 명의 조건별 변경을 하는 경우.
       즉 T_00 , T_02라는 테이블이 있을 경우 하나의 SQL로 조건에 따라
       2개의 테이블을 사용하고자 할때입니다.


그런데 이렇게 Dynamic SQL를 사용할때 주의할 점이 있습니다.
바로 변수로 사용되는 값입니다.

sprintf(sql, "Select * From T_01 Where id='%s'  \n", "1234");
와 같이 SQL를 만들고 실행하면 이와 비슷한 SQL이 100번 호출된다고 하면
DBMS는 매번 새로 파싱해 버립니다. 즉 재 사용을 하지 않는 것이죠.

그러면 이럴때 어떻게 해야 할까요?

바로 바인드 변수 사용입니다. 자바로 DB작업을 해보신 분들은 아시겠지만
자바에서는 PreparedSatement를 사용하는 경우와 같다고 보시면 됩니다.
바인드 변수를 사용하기 위해선 아래와 같이 SQL를 작성합니다.
sprintf(sql, "Select * From T_01 Where id=:var  \n");

그리고 SQL를 파싱할때 아래와 같은 구문으로 변수에 값을 할당합니다.
EXEC SQL OPEN 커서명 USING :V_ID; /* V_ID는 1234를 담은 변수입니다. */
위 같이 하면 변수가 상수롤 삽입되어 실행되는 것이 아니라 변수로 실행되어
Library Cache 메모리의 낭비나 성능 상의 문제를 방지할 수 있습니다.

PS) 위는 데이터를 조회하는 경우지만 갱신하는 경우 즉 insert, update, delete 문도
   동일하게 바인드 변수를 사용할 수 있습니다.
  SQL를 만들고  PREPARE 구문을 사용한 후  EXECUTE 구문을 사용합니다.
  EXEC SQL PREPARE SP FROM :qry;
  EXEC SQL EXECUTE SP USING :V_ID;

 

반응형